2008-10-23 25 views
142

Dưới đây là hai câu hỏi khác nhau nhưng tôi cho rằng chúng có liên quan.Sử dụng Git làm cách nào để tìm các thay đổi giữa địa phương và từ xa

  1. Khi sử dụng Git, làm thế nào để tìm thấy mà thay đổi tôi đã cam kết tại địa phương, nhưng chưa đẩy lên một chi nhánh từ xa? Tôi đang tìm một cái gì đó tương tự như lệnh Mercurial hg outgoing.

  2. Khi sử dụng Git, làm thế nào để tôi tìm thấy những gì thay đổi một nhánh từ xa trước khi thực hiện thao tác kéo? Tôi đang tìm một cái gì đó tương tự như lệnh Mercurial hg incoming.

Thứ hai: có cách nào để xem những gì có sẵn và sau đó chọn các thay đổi mà tôi muốn kéo?

+11

Nhìn vào các câu trả lời, có vẻ như có một số nhầm lẫn về những gì 'hg đến' và' hg outgoing' thực sự làm. Git tương đương gần nhất tôi tìm thấy là tùy chọn '--dry-run'. Chỉ cần 'git pull --dry-run' và bạn sẽ thấy một danh sách tất cả những điều cần phải xảy ra. –

Trả lời

96

Git không thể gửi loại thông tin đó qua mạng, như Hg có thể. Nhưng bạn có thể chạy git fetch (giống như hg pull hơn hg fetch) để tìm nạp các cam kết mới từ các máy chủ từ xa của bạn.

Vì vậy, nếu bạn có chi nhánh gọi là master và điều khiển từ xa có tên origin, sau khi chạy git fetch, bạn cũng nên có chi nhánh được gọi là origin/master. Sau đó, bạn có thể nhận được git log của tất cả các cam kết rằng master cần phải là một superset của origin/master bằng cách thực hiện git log master..origin/master. Đảo ngược hai thứ đó để đối diện.

Một người bạn của tôi, David Dollar, đã tạo một vài kịch bản lệnh git shell để mô phỏng hg incoming/outgoing. Bạn có thể tìm thấy chúng tại http://github.com/ddollar/git-utils.

32
  1. Sử dụng "git log origin..HEAD"

  2. Sử dụng "git fetch" tiếp theo là "git log HEAD..origin". Bạn có thể chọn các cam kết cá nhân bằng cách sử dụng các id cam kết được liệt kê.

Ở trên giả định, tất nhiên, đó là "nguồn gốc" là tên của chi nhánh theo dõi từ xa của bạn (mà nó là nếu bạn đã sử dụng bản sao với các tùy chọn mặc định).

+3

(Và nếu bạn không theo dõi chi nhánh từ xa, đó là “nguồn gốc log git/master..HEAD”.) – plindberg

+4

"origin" không phải là tên của nhánh theo dõi từ xa, đó là tên của điều khiển từ xa. Và chỉ cần chỉ định tên từ xa không hoạt động, bạn phải chỉ định nhánh theo dõi từ xa, vốn sẽ là origin/master. – robinst

41

Không phải là câu trả lời đầy đủ nhưng git fetch sẽ kéo repo từ xa và không thực hiện hợp nhất. Sau đó, bạn có thể thực hiện

git diff master origin/master

+1

Làm việc cho tôi (nhưng cách khác) - 'git diff origin/master master' –

19

Ngoài ra còn có này, để so sánh tất cả các chi nhánh:

git log --branches --not --remotes=origin 

Đây là những gì git trang người đàn ông log nói về điều này:

Shows all commits that are in any of local branches but not in any of remote tracking branches for origin (what you have that origin doesn’t).

Trên đây là cho outgoing. Đối incoming, chỉ cần trao đổi:

git log --remotes=origin --not --branches 
100

Bắt đầu với Git 1.7.0, có một cú pháp đặc biệt cho phép bạn quát tham khảo các chi nhánh thượng nguồn: @{u} hoặc @{upstream}.

Để bắt chước hg incoming:

git log [email protected]{u} 

Để bắt chước hg outgoing:

git log @{u}.. 

tôi sử dụng sau incomingoutgoing bí danh để làm cho trên dễ dàng hơn để sử dụng:

git config --global alias.incoming '!git remote update -p; git log [email protected]{u}' 
git config --global alias.outgoing 'log @{u}..' 
+0

git log .. @ {u} cho tôi những lỗi này. (Tôi có cả hai nguồn gốc và một kho lưu trữ ngược dòng trong cấu hình git của tôi). Lỗi : Không tìm thấy chi nhánh thượng nguồn nào cho lỗi '' : Không tìm thấy chi nhánh ngược dòng nào cho '..' lỗi: Không tìm thấy nhánh thượng lưu nào cho' .. ' gây tử vong: đối số mơ hồ' .. @ {u} ': bản sửa đổi hoặc đường dẫn không xác định không có trong cây đang hoạt động. Sử dụng '-' để tách các đường dẫn khỏi các bản sửa đổi – Henrik

+6

Bạn sẽ nhận được các lỗi đó nếu chi nhánh địa phương của bạn không được định cấu hình với luồng ngược dòng. Để khắc phục, hãy chạy 'git branch --set-upstream foo origin/foo'. –

+0

hoạt động tốt cho tôi, chúc mừng –

1

git-out là một kịch bản giả lập hg outgoing khá chính xác. Nó phân tích cú pháp trên đầu ra "push -n", vì vậy nó tạo ra đầu ra chính xác nếu bạn cần chỉ rõ các đối số bổ sung để đẩy.

+0

Không cho các cửa sổ? –

+0

@techtonik không có ý tưởng. – stepancheg

0

git đến

$ git fetch && git log ..origin/master --stat 
OR 
$ git fetch && git log ..origin/master --patch 

git đi

$ git fetch && git log origin/master.. --stat 
OR 
$ git fetch && git log origin/master.. --patch 
7

tôi sẽ làm

$ git fetch --dry-run 

cho hg incoming

$ git push --dry-run 

cho hg outgoing.

+0

Xin lỗi, tôi đã bỏ qua điều này đã được nói như là một bình luận cho OP. – chris

0

Khi câu trả lời "git log" và @ {u} ban đầu đã cho tôi lỗi "sửa đổi không xác định", tôi đã thử đề xuất của Chris/romkyns là git push --dry-run.

Bạn sẽ nhận được kết quả như "5905..4878 master-> master". 5905 là cam kết mới nhất mà từ xa có và cam kết thông qua (và bao gồm) 4878 sẽ được áp dụng cho điều khiển từ xa.

Sau đó bạn có thể sử dụng 5905..4878 như các đối số tới vài git khác lệnh để biết thêm chi tiết:

git diff 5905..4878 # Gives full code changes in diff style 

git log --online 5905..4878 # Displays each commit's comment 
-1

Khi bạn git fetch, tất cả các nội dung bao gồm các chi nhánh, các thẻ (refs) được lưu trữ tạm thời trong .git/FETCH_HEAD có thể xem nội dung bằng lệnh: git log FETCH_HEAD Nếu bạn không sử dụng hậu tố -a với git fetch thì theo mặc định, nội dung của FETCH_HEAD sẽ bị ghi đè bởi nội dung mới. Từ những nội dung này, bạn có thể xem và quyết định nhánh nào bạn muốn hợp nhất chúng nếu bạn làm hoặc bạn có thể chọn cherry-pick đơn giản nếu bạn chỉ muốn một vài cam kết từ những gì đã được tìm nạp.

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