Sử dụng Git làm cách nào để tìm các thay đổi giữa cục bộ và từ xa


152

Đây là hai câu hỏi khác nhau nhưng tôi nghĩ chúng có liên quan.

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

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

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


11
Nhìn vào các câu trả lời, dường như có một số nhầm lẫn về những gì hg incominghg outgoingthực sự làm. Tương đương Git gần nhất tôi tìm thấy là --dry-runtùy chọn. Chỉ git pull --dry-runvà bạn sẽ thấy một danh sách tất cả những điều cần phải xảy ra.
Roman Starkov

Câu trả lời:


97

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 pullhơn hg fetch) để lấy 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ó một nhánh được gọi mastervà một điều khiển từ xa được gọi origin, sau khi chạy git fetch, bạn cũng nên có một nhánh được gọi origin/master. Sau đó, bạn có thể nhận được git logtất cả các cam kết mastercần phải thay thế origin/masterbằng cách thực hiện git log master..origin/master. Đảo ngược hai cái đó để có được điều ngược lại.

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


113

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

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

git log ..@{u}

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

git log @{u}..

Tôi sử dụng các bí danh incomingoutgoingbí danh sau để dễ sử dụng hơn:

git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'

git log .. @ {u} cho tôi những lỗi này. (Tôi có cả nguồn gốc và kho lưu trữ ngược dòng trong cấu hình git của mình). lỗi: Không tìm thấy nhánh ngược dòng cho '' lỗi: Không tìm thấy nhánh ngược dòng cho '..' lỗi: Không tìm thấy nhánh ngược dòng cho '..' fatal: đối số mơ hồ '.. @ {u}': không biết sửa đổi hoặc đường dẫn Cây làm việc. Sử dụng '-' để tách các đường dẫn khỏi các phiên bản
Henrik

6
Bạn sẽ nhận được những lỗi đó nếu chi nhánh địa phương của bạn không được cấu hình với một dòng ngược. Để sửa, chạy git branch --set-upstream foo origin/foo.
Richard Hansen

git log @{u}..liệt kê mọi thay đổi trong repo cho tôi Không có cách nào họ không tồn tại.
Roman Starkov

@romkyns: Có thể chi nhánh địa phương của bạn có chi nhánh từ xa được cấu hình là ngược dòng. Hãy chắc chắn git rev-parse --symbolic-full-name @{u}in các tài liệu tham khảo từ xa thích hợp. Ngoài ra, git log @{u}..hiển thị các cam kết không thể truy cập được bởi nhánh ngược dòng, có thể bao gồm các cam kết đã có trong kho lưu trữ từ xa (nếu chúng có thể truy cập được bằng một tham chiếu khác). Điều này sẽ xảy ra ngay sau khi bạn hợp nhất trong một nhánh đã được đẩy.
Richard Hansen

@RichardHansen Tôi e rằng tôi không biết điều gì sẽ phù hợp cho một tài liệu tham khảo từ xa, tuy nhiên đây là một repo mới được nhân bản mà tôi chỉ làm một checkout <somebranch>merge <otherbranch>. Tại thời điểm này, tôi đã làm log @{u}..và thấy mọi thay đổi được liệt kê.
Roman Starkov

42

Không phải là một 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ể làm một

nguồn gốc git diff / master


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

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

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

Tất nhiên, các giả định ở trên cho rằng "nguồn gốc" là tên của nhánh theo dõi từ xa của bạ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, thì đó là nguồn gốc / bản ghi nhật ký git của Nhật Bản.)
plindberg

4
"origin" không phải là tên của nhánh theo dõi từ xa, nó là tên của remote. 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, đó sẽ là nguồn gốc / chủ.
cướp

22

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

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

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

Hiển thị tất cả các cam kết trong bất kỳ chi nhánh địa phương nào nhưng không hiển thị trong bất kỳ chi nhánh theo dõi từ xa nào về nguồn gốc (những gì bạn có nguồn gốc đó không có).

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

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

8

tôi sẽ làm

$ git fetch --dry-run

cho hg incoming

$ git push --dry-run

cho hg outgoing.


Xin lỗi, tôi đã bỏ qua rằng điều này đã được nói như là một nhận xét cho OP.
chris

1

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


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

0

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

Bạn sẽ nhận được một đầu ra, chẳng hạn như "5905..4878 master-> master". 5905 là cam kết mới nhất mà điều khiển 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 làm đối số cho một số lệnh git khác để 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 thực hiện git fetch, tất cả nội dung bao gồm các nhánh, thẻ (ref) được lưu trữ tạm thời trong .git / FETCH_HEAD có nội dung có thể được xem 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 chi 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 đơ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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.