Làm thế nào tôi có thể thấy những gì tôi sắp đẩy bằng git?


588

Có cách nào để xem những gì sẽ được đẩy nếu tôi thực hiện một git pushlệnh?

Những gì tôi đang hình dung là một cái gì đó giống như tab "Thay đổi tệp" trong tính năng "yêu cầu kéo" của Github. Khi tôi đưa ra yêu cầu kéo, tôi có thể xem và xem cái gì sẽ được kéo nếu họ chấp nhận yêu cầu kéo của tôi:ví dụ github của thay đổi tổng hợp

Dòng lệnh là OK, nhưng tôi thích một số loại GUI (như ảnh chụp màn hình ở trên).



Nhiều câu hỏi / câu trả lời liên quan; đây là một cái khác: stackoverflow.com/questions/2176278/preview-a-git-push/
mẹo

Câu trả lời:


665

Để danh sách các tệp được đẩy, hãy chạy:

git diff --stat --cached [remote/branch]

thí dụ:

git diff --stat --cached origin/master

Đối với mã diff của các tệp được đẩy, hãy chạy:

git diff [remote repo/branch]

Để xem đường dẫn tệp đầy đủ của các tệp sẽ thay đổi, hãy chạy:

git diff --numstat [remote repo/branch]

Nếu bạn muốn thấy những khác biệt này trong GUI, bạn sẽ cần cấu hình git cho điều đó. Xem Làm cách nào để tôi xem đầu ra 'git diff' với chương trình tìm khác biệt trực quan? .


8
Cả hai biến thể của git diff - được cung cấp mà không có cam kết đưa ra sẽ chỉ hiển thị các khác biệt liên quan đến CHÍNH. Tôi nghĩ bạn có nghĩa là git diff [--stat] --cached origin / master, giả sử nhánh chính của nguồn gốc là master
mfontani

52
Đây không phải là chính xác những gì bạn muốn. Bạn nên tìm khác biệt HEAD, không phải chỉ mục, so với origin ( git diff origin/master HEAD). Chỉ số khác nhau sẽ cho kết quả tương tự nếu và chỉ khi bạn không có thay đổi nào được tổ chức cho cam kết. Nếu bạn có các thay đổi được dàn dựng, chúng sẽ được đưa vào khác biệt, nhưng rõ ràng sẽ không được đẩy vì chúng chưa được cam kết.
Cascabel

5
Câu trả lời này cần được chỉnh sửa để đưa thông tin vào bình luận từ @Jefromi git diff --stat origin/master HEADlà câu trả lời đúng.
Tony Topper

2
@mfontani có câu trả lời đúng cho tôi. Tôi muốn kiểm tra những gì sẽ được đẩy từ những gì tôi đã cam kết, chứ không phải những gì sẽ được cam kết nếu tôi cam kết mọi thứ tôi đã thay đổi. git diff --cached [remote/branch]thực hiện mánh khóe :)
poshaughnessy 25/11/13

2
thay vì nhập origin / master, bạn có thể sử dụng @ {u}, vd: git diff @ {u} hoặc git diff HEAD @ {u} Lưu ý rằng điều này chỉ hoạt động nếu bạn có một nhánh theo dõi ngược dòng đã được tạo và liên kết. Tôi thấy nó hữu ích khi tôi có rất nhiều chi nhánh và rất nhiều điều khiển từ xa để tôi không phải suy nghĩ về những gì được liên kết ở đâu.
Damien Sawyer

192

Luôn luôn có chạy khô:

git push --dry-run

Nó sẽ làm mọi thứ trừ việc thực sự gửi dữ liệu.

Nếu bạn muốn có một cái nhìn đồ họa nhiều hơn, bạn có một loạt các tùy chọn.

Tig và tập lệnh gitk đi kèm với git đều hiển thị nhánh hiện tại của bản sao cục bộ của bạn và nhánh của điều khiển từ xa hoặc nguồn gốc.

văn bản thay thế

Vì vậy, bất kỳ cam kết nào bạn thực hiện sau nguồn gốc là các cam kết sẽ được đẩy.

Mở gitk từ shell trong khi ở nhánh bạn muốn đẩy bằng cách gõ gitk&, sau đó để thấy sự khác biệt giữa những gì trên điều khiển từ xa và những gì bạn sắp đẩy vào điều khiển từ xa, chọn cam kết không được đánh dấu cục bộ của bạn và nhấp chuột phải vào điều khiển và chọn "Khác này -> đã chọn": văn bản thay thế


18
git đẩy --dry-run không cho tôi thấy bất cứ điều gì giống như những gì tôi hy vọng nhìn thấy. gitk gần hơn, nhưng nó không hiển thị cho tôi tổng cộng tất cả các thay đổi sẽ được đẩy. Vì vậy, nếu tôi đẩy 6 lần cam kết vào điều khiển từ xa, tôi muốn xem tổng cộng những gì sẽ được đẩy. Tôi không quan tâm mỗi cam kết có gì bởi vì một cam kết có thể bị phủ nhận hoàn toàn bởi lần tiếp theo.
cmcculloh

1
Nếu bạn cần một khác biệt của những gì sẽ được đẩy, làm git diff --stat HEAD origin/masterhoặc git diff HEAD origin/master. Quan trọng là ĐẦU , nếu không, bạn bao gồm các thay đổi không được cam kết trong diff của bạn
Daniel Alder

Có một số lý do mà git không tự động chạy khô trước khi nó cố gắng đẩy dữ liệu đến một điều khiển từ xa? Nếu bạn đang đẩy một lượng lớn dữ liệu, nó sẽ tải lên tất cả dữ liệu và sau đó hiển thị bất kỳ lỗi nào sau đó. Bạn vừa lãng phí thời gian và băng thông tải lên dữ liệu mà bây giờ bạn phải tải lên lại. Đây dường như là hành vi kỳ lạ.
zeusstl

1
Vấn đề với git push --dry-runlà nó vẫn yêu cầu quyền ghi từ xa. Vì vậy, nếu bạn có một bản sao mà không được phép đẩy ngược dòng, nhưng bạn muốn xem những thay đổi chưa được xử lý cục bộ của bạn là gì, --dry-runsẽ không làm điều đó.
Ed Avis

Đây là một giải pháp tốt, nhưng cần lưu ý rằng nó yêu cầu kết nối với điều khiển từ xa (bao gồm cả nhập khóa SSH nếu có). Nếu bạn chỉ muốn thấy sự khác biệt giữa branchorigin/branch, tôi sẽ đi với câu trả lời của Ionuț G. Stan, vì nó không thực sự yêu cầu kết nối với repo từ xa. Điều này có thể tốt hoặc xấu, tùy thuộc vào những gì bạn cần.
Sean the Bean

169

Để chỉ liệt kê các cam kết đang chờ để được đẩy: ( đây là một trong những bạn sẽ nhớ )

git cherry -v

Hiển thị các đối tượng cam kết bên cạnh SHA1.


5
Một điều thú vị là bạn có thể chỉ định một điều khiển từ xa để so sánh như: git cherry -v heroku/remotetrong trường hợp bạn giữ mã của mình ở nhiều hơn một điều khiển.
fagiani 30/03/2016

Lệnh bổ sung tốt nhất cho phép chúng ta thực sự tương quan với sự khác biệt mà các cam kết này có là gì?
Hassan Baig

Lệnh này rất hay, nhưng tôi muốn biết thêm chi tiết, như tên của các tệp sẽ được thay đổi trong quá trình đẩy.
LS

21

Bạn có thể muốn chạy git difftool origin/master.... điều đó sẽ hiển thị sự khác biệt thống nhất của những gì trên nhánh hiện tại của bạn chưa có trên nhánh gốc / nhánh chính và hiển thị nó trong công cụ tìm đồ họa khác bạn chọn. Để được cập nhật nhất, hãy chạy git fetchtrước.


2
git difftool -d origin/master, Tôi đã cài đặt Difftool của mình để nó hoạt động rất tốt, thx!
Sức mạnh Bảo Bình

git difftool -dlà cách tốt hơn, cảm ơn sức mạnh của Bảo Bình. Vấn đề duy nhất là nó không phát hiện các tệp đã di chuyển và thay vào đó hiển thị chúng là đã bị xóa và thêm vào.
EM0

8

Một cách để so sánh phiên bản địa phương của bạn trước khi đẩy nó vào repo từ xa (loại đẩy trong chạy khô):

Sử dụng TortoiseGit:
Nhấp chuột phải vào dự án thư mục gốc> TortoiseGit> Khác với phiên bản trước>
cho Phiên bản 2 chọnrefs/remotes/origin/master


8

Hãy thử git diff origin/master..master(giả sử đó origin/masterlà thượng nguồn của bạn). Không giống như git push --dry-run, điều này vẫn hoạt động ngay cả khi bạn không có quyền viết lên thượng nguồn.


5

Sử dụng git gui, ở đó bạn có thể thấy một danh sách những gì đã thay đổi trong cam kết thực tế của bạn. Bạn cũng có thể sử dụng gitkwich cung cấp một giao diện dễ dàng cho reflog. Chỉ cần so sánh giữa remotes/...masterđể xem, những gì sẽ được đẩy. Nó cung cấp một giao diện tương tự như ảnh chụp màn hình của bạn.

Cả hai chương trình được bao gồm trong git.


1
Tôi không thấy bất cứ nơi nào trong git gui cho thấy tất cả mọi thứ đã được cam kết nhưng không được thúc đẩy.
cmcculloh

Trong git gui bạn có thể thấy, những gì đã sửa đổi nhưng không được cam kết. Trong gik (Qua gitk --allbạn nhận được một danh sách đầy đủ tất cả các nhận xét. Bây giờ bạn có thể so sánh trạng thái thực tế của nhánh dev của mình với điều khiển từ xa.
fuz

4

Để xem tập tin nào được thay đổi xem các thay đổi mã thực tế so với masterchi nhánh bạn có thể sử dụng:

git diff --stat --patch origin master

LƯU Ý : Nếu bạn tình cờ sử dụng bất kỳ IDE Intellij nào thì bạn có thể nhấp chuột phải vào dự án cấp cao nhất của mình, chọn Git > So sánh với chi nhánh > và chọn nguồn gốc bạn muốn, vd origin/master. Trong cây tệp sẽ xuất hiện, bạn có thể bấm đúp vào tệp để xem khác biệt trực quan. Không giống như tùy chọn dòng lệnh ở trên, bạn có thể chỉnh sửa các phiên bản cục bộ của mình từ cửa sổ tìm khác biệt.


3

Bạn có thể liệt kê các cam kết bằng cách:

git cherry -v

Và sau đó so sánh với lệnh sau trong đó số ^ bằng với số lần xác nhận (trong ví dụ là 2 lần xác nhận):

git diff HEAD^^

Nó chỉ đơn giản là tốt để xem danh sách các cam kết mới nhất. Điều này sẽ không cung cấp tên của (các) tập tin. Do đó, một số người trả lời bằng cách sử dụng tùy chọn chạy khô và tùy chọn vá là tốt hơn. git diff --stat --patch bản gốc git đẩy --dry-run
Sree Rama

2

Nếu bạn đang sử dụng Mac OS X, tôi khuyên bạn nên tải Tower, đây là một chương trình tuyệt vời khiến tôi cảm thấy hài lòng với Git. Bây giờ tôi phải nhớ các lệnh đầu cuối và nó cung cấp một GUI tuyệt vời để xem, theo dõi và giải quyết các khác biệt trong các tệp.

Và không, tôi không liên kết với họ, tôi chỉ sử dụng phần mềm của họ và thực sự thích nó.

http://www.git-tower.com/


2
Tôi sử dụng Tower, nhưng làm thế nào bạn có thể thấy các tệp đã được cam kết nhưng không được đẩy?
Michael Irey

Điều này không trả lời câu hỏi.
Revierpost

1

Chỉ cần thêm hai xu của tôi ... Tôi muốn thực hiện điều này khi chạy các công việc trong một đường ống gitlab trên một người chạy gitlab. Cách tốt nhất để làm điều này là sử dụng tập lệnh này:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA

Ngoài ra trong trường hợp của tôi, tôi muốn lọc các tệp theo phần mở rộng, để đạt được điều này tôi đã sử dụng:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA '*.py'

Sau đó, bạn có thể chuyển tiếp danh sách này sang một nơi khác, có lẽ là một kẻ nói dối;)

Hy vọng điều này sẽ giúp được ai đó.


1
  1. Nếu bạn có quyền ghi trên remote
git push --dry-run
  1. Nếu bạn không có quyền ghi trên remote
git diff --stat HEAD remote/branch

0

Sau đó git commit -m "{your commit message}", bạn sẽ nhận được một băm cam kết trước khi đẩy. Vì vậy, bạn có thể thấy những gì bạn sắp sửa bằng gitcách chạy lệnh sau:

git diff origin/{your_branch_name} commit hash

ví dụ: git diff origin/master c0e06d2


Cảm ơn bạn đã trả lời nhưng tôi nghĩ rằng nỗ lực này là không cần thiết vì câu hỏi khá cũ và được bình chọn cao. Bạn tốt hơn hết là nỗ lực chi tiêu cho các câu hỏi khác nhau.
Pbd
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.