2012-02-19 25 views
12

Tôi đã chuyển tệp từ Project đến Project/src. Git có ấn tượng rằng tôi đã xóa các tệp từ Project và tạo các tệp mới trong Project/src.Thanh toán nhiều tệp đã được di chuyển trong cây đang hoạt động

Ngoài ra, tôi có nhiều thay đổi khác trong cây đang hoạt động mà tôi muốn cam kết. My git status:


$ git status 
# On branch feature/cmake 
# Changes to be committed: 
# (use "git reset HEAD ..." to unstage) 
# 
# new file: .gitignore 
# new file: CMakeLists.txt 
# deleted: Wasa.xcodeproj/project.pbxproj 
# deleted: Wasa/Wasa.1 
# renamed: Wasa/main.cpp -> main.cpp 
# new file: src/CMakeLists.txt 
# Lots of new files listed here 
# 
# Changes not staged for commit: 
# (use "git add/rm ..." to update what will be committed) 
# (use "git checkout -- ..." to discard changes in working directory) 
# 
# modified: CMakeLists.txt 
# deleted: IODevice.h 
# Lots of deleted files listed here. 

Tôi muốn unstage các tệp nguồn - *.{cpp,h}. Tôi biết làm thế nào để unstage (liên kết here, ví dụ, là hữu ích). Điều tôi muốn tránh đang thực hiện đang nhập rất nhiều git checkout <filename>.

Tôi không muốn thanh toán HEAD, vì một số thay đổi trong cây đang hoạt động mà tôi muốn giữ lại. Tôi đã cố gắng làm git checkout *.{cpp,h}, mang đến cho những điều sau đây:


$ git checkout *.{cpp,h} 
zsh: no matches found: *.cpp 

Bởi vì các tập tin hiện không tồn tại trong cây làm việc, tôi không thể kiểm tra chúng ra vì *.{cpp,h} không phù hợp với bất kỳ tập tin.

Các tệp này đều có trong Project/src; có lẽ là một regex hoặc một cái gì đó tôi có thể chạy với đầu ra của ls src đường ống vào lệnh git checkout, nhưng tôi muốn biết nếu git có thể làm điều này cho tôi một mình. Có cách nào tôi có thể làm điều này trong git?

Trả lời

27

Thoát khỏi *:

$ git checkout \*.{cpp,h} 
+0

Nếu các tệp tồn tại trong thư mục, git (hoặc có thể trình bao, tôi không chắc chắn) chấp nhận '*. {Cpp, h}' và mở rộng tệp đó cho tất cả các tệp phù hợp. Vấn đề của tôi là tôi không * có * tập tin phù hợp; họ đã chuyển sang 'src/*. {cpp, h}' và tôi đang cố gắng tìm một cách lười biếng để kiểm tra các tệp mà không cần gõ 'git checkout ', 'git checkout ' vv – simont

+0

Nếu bạn thoát khỏi sao, nó sẽ không khớp trong vỏ. Chỉ cần thử :-) – Irfy

+0

Heh. Lỗi của tôi; hoàn toàn đọc sai những gì bạn đã viết. Điều đó hoạt động - cảm ơn bạn rất nhiều. – simont

2

Đối với kiểm tra ra nhiều file. Tôi chỉ thực hiện các ký tự đại diện và nó hoạt động tốt cho tôi. Đối với các tệp cụ thể, chúng tôi có thể yêu cầu một mẹo khác.

tôi đã sử dụng:

git checkout -- *.*

trong Git Bash của tôi. và tất cả các tệp đã sửa đổi trong không gian làm việc của tôi đã được thay thế bằng các tệp trong repo.

Tôi hy vọng nó sẽ giúp, cảm ơn.

+0

Vấn đề với điều này là chính xác những gì được chỉ ra trong câu trả lời được chấp nhận, rằng '*' được mở rộng bởi vỏ (bash, zsh ...) cho tất cả các tệp phù hợp, có thể là không, nếu bạn đã di chuyển/xóa chúng. Trong khi '\ *' trong ngữ cảnh này được mở rộng bằng 'git' thành các tệp được theo dõi bởi git, tức là' git add' đã được áp dụng cho chúng.Ngay cả khi các tệp được di chuyển/xóa 'git checkout \ *' sẽ mở rộng đến các tên tệp đó cho đến khi bạn cam kết di chuyển/xóa chúng. Trong thực tế, để cam kết loại bỏ 'file.end' bạn phải thực hiện' git commit file.end' và tệp đó thậm chí không có (nhưng để git nó là). –

+0

Điều đó rất đúng. Cảm ơn Jonatan. Xin lỗi về noobness – Divesh

Các vấn đề liên quan