Câu hỏi Xem Cam kết Git chưa được chải chuốt


Làm cách nào tôi có thể xem bất kỳ cam kết cục bộ nào mà tôi đã thực hiện, chưa được chuyển đến kho lưu trữ từ xa? Thỉnh thoảng, git status sẽ in ra rằng nhánh của tôi là X cam kết trước origin/master, nhưng không phải lúc nào.

Đây có phải là lỗi với bản cài đặt Git của tôi hay tôi đang thiếu thứ gì đó?


1349
2018-01-06 22:41


gốc


Bắt đầu với Git 2.5+ (Q2 2015), câu trả lời thực tế sẽ là git log @{push}... Xem lối tắt mới đó @{push} (tham khảo nhánh theo dõi từ xa bạn đang đẩy đến) trong câu trả lời của tôi bên dưới - VonC
@ Torek - một nhiệm vụ đơn giản khác đã gây khó khăn cho Git. Mỗi khi một câu hỏi của Git xuất hiện với hàng trăm hoặc hàng ngàn upvotes và hàng triệu lượt xem, thì ai đó nên suy nghĩ: Wow, chúng tôi thực sự vặn lên luồng công việc đó. Than ôi, nhà phát triển của Git đã bỏ qua bước phản hồi trong vòng đời phát triển, vì vậy phản hồi không được kết hợp. Thay vào đó, họ tiếp tục làm cho những sai lầm tương tự hơn và hơn nữa. Đối với câu hỏi này, git status --all nên đã xuất hiện trong năm 2010; hoặc là git status -v nên thực sự cung cấp đầu ra tiết có chứa thông tin bổ sung. - jww
Tôi không đồng ý rằng "git status -v" nên cung cấp thông tin này bởi vì nó được thiết kế để cung cấp trạng thái về cây đang hoạt động, vì nó chỉ liên quan đến nhánh được kiểm tra. Tuy nhiên, hãy xem câu trả lời bên dưới về "git branch -v", mà tôi tin là câu trả lời được chấp nhận - JoelFan
Câu hỏi StackOverflow đặc biệt này có số lượng câu trả lời đúng nhất mà tất cả các công việc đều không có ý nghĩa gì. - Pete Alvin


Các câu trả lời:


git log origin/master..HEAD

Bạn cũng có thể xem diff bằng cách sử dụng cùng cú pháp

git diff origin/master..HEAD

1404
2018-01-06 22:50



Điều này đã làm nó cho tôi - vì một số lý do git log origin .. bởi chính nó đã ném một lỗi. Có vẻ như tôi cũng đã gặp sự cố với cách chi nhánh địa phương của tôi được định cấu hình - sau khi tôi thực hiện các thay đổi tôi đã tìm thấy ở đây: wincent.com/blog/…... vấn đề đã được giải quyết, và tôi có thể sử dụng trạng thái git một lần nữa để xem những gì tôi muốn. - Josh Buhler
Vô giá: Tôi đã làm rất nhiều git config --global alias.ahead "log origin/master..HEAD --oneline" để tôi có thể nhanh chóng tìm ra nơi tôi đang ở. Thậm chí nhiều kẹo hơn: for i in *; do echo $i && git ahead 2>/dev/null; done - Jamie
git log --stat origin/master..HEAD cho thêm một chút khiếp sợ - Cory Danielson
Đây không phải là giải pháp tốt nhất. Nguồn gốc / bản gốc có thể không phải lúc nào cũng là nhánh ngược dòng. Một giải pháp tốt hơn là sử dụng @ {u} thay vì "origin / master" để chỉ ra nhánh thượng nguồn. Vì HEAD được ngụ ý theo mặc định, người ta có thể bỏ điều đó ra ngoài. Xem câu trả lời của @Ben Ling. Thay đổi gửi đi: git log @ {u} .. Thay đổi đến: git log .. @ {u} - PlagueHammer
@Nocturne Tôi chỉ muốn chỉ ra rằng khi câu trả lời này đã được đăng, @{u} cú pháp chưa có sẵn, nó chỉ có sẵn trên Ngày 12 tháng 2 năm 2010. Cũng thế, @{u} sẽ không hoạt động nếu nhánh địa phương không được cấu hình với luồng ngược dòng. Cuối cùng, @{u} hiện không có hỗ trợ hoàn thành tab, <remote>/<branch> với hoàn thành tab vẫn là một trong những cách nhanh nhất để có được thông tin này, và nó sẽ làm việc cho dù một thượng nguồn được cấu hình hay không.


Nếu bạn muốn xem tất cả các cam kết trên tất cả các nhánh chưa được đẩy, bạn có thể đang tìm kiếm một cái gì đó như thế này:

git log --branches --not --remotes

Và nếu bạn chỉ muốn thấy cam kết gần đây nhất trên mỗi nhánh, và tên chi nhánh, điều này:

git log --branches --not --remotes --simplify-by-decoration --decorate --oneline

601
2017-07-26 20:36



Điều này thật tuyệt. Trong một kịch bản có liên quan, tôi có hai chi nhánh địa phương với hai nhánh thượng lưu, và một tay địa phương được sáp nhập vào nhau. Tôi muốn biết những cam kết nào an toàn để rebase, nhưng bình thường git log master..HEAD sẽ không hoạt động vì có nhiều thượng nguồn. Bài đăng này đã dẫn tôi đến git log MyBranch --not --remotes để hiển thị tất cả các cam kết chưa được đẩy tới bất kỳ luồng nào trong một nhánh. - pavon
Điều này rất hữu ích tôi đã bí danh nó trong cấu hình zsh của tôi. Cảm ơn. - Scotty C.
Tôi hiểu rằng lệnh thứ hai của bạn cũng đang liệt kê các cam kết chưa được đẩy, chỉ có nó hiển thị mỗi một nhánh. - Stephane
--decorate cho thấy các chi nhánh là tốt. --graph làm cho nó rõ ràng hơn. - Ray
Lưu ý rằng các lệnh này chỉ liệt kê các cam kết chưa được đẩy vào bất kì chi nhánh. Ví dụ: giả sử bạn có nhánh phát triển với chi nhánh feat-NewThing. Bạn thay đổi cục bộ thành feat-NewThing. (Đăng nhập có thay đổi.) Sau đó, bạn nhấn feat-newThing vào nhánh từ xa của nó. (Nhật ký trống). Bạn hợp nhất địa phương feat-newThing để phát triển cục bộ. Giả sử tiến nhanh, nhật ký vẫn không có thay đổi. - Patrick W


Bạn có thể hiển thị tất cả các cam kết mà bạn có tại địa phương nhưng không bắt đầu với

git log @{u}..

@{u} hoặc là @{upstream} có nghĩa là nhánh thượng nguồn của nhánh hiện tại (xem git rev-parse --help hoặc là git help revisions để biết chi tiết).


262
2017-11-18 12:19



Trên Windows, tôi cần đính kèm đối số cuối cùng trong dấu ngoặc kép, như: git log "@ {u} .." - Jon Schneider
git diff @{u}.. cũng hoạt động - 18446744073709551615
Đây sẽ là câu trả lời được chấp nhận! - lei liu


Điều này làm việc cho tôi:

git cherry -v 

Như được chỉ ra tại Git: Xem tất cả các cam kết chưa cam kết hoặc cam kết không nằm trong một nhánh khác.


118
2017-12-17 01:15



Tôi nghĩ rằng đây sẽ là câu trả lời chính vì câu trả lời này mang lại danh sách cam kết ngắn gọn hơn thay vì khó đọc, khác biệt trong tất cả các tệp !! - ViFI
git-cherry - "Tìm các cam kết chưa được áp dụng cho thượng nguồn", dường như cung cấp những gì OP đã yêu cầu, nhưng chỉ với chủ đề cam kết chứ không phải là toàn bộ thông điệp cam kết. - Eido95
Cần lưu ý rằng điều này sẽ chỉ cho bạn biết nếu có cam kết chưa được xóa trên chi nhánh bạn hiện đã thanh toán. Nó sẽ không cho bạn biết nếu bạn có một chi nhánh địa phương (hiện không được kiểm tra) với cam kết chưa được rửa. - Dave Yarwood
Câu trả lời hay nhất, cảm ơn - SwimBikeRun


Bạn có thể làm điều này với git log:

git log origin..

Giả sử răng origin là tên của thượng nguồn của bạn, để lại bất kỳ tên sửa đổi nào sau .. ngụ ý HEAD, liệt kê các cam kết mới chưa được đẩy.


55
2018-01-06 22:46



Bất cứ khi nào tôi thấy câu trả lời git log và "2 chấm-not-3", nó luôn nhắc nhở tôi về stackoverflow.com/questions/53569/…;) - VonC
Thật trùng hợp, tôi cũng thế! - Greg Hewgill
Chỉ cần thêm nó vào câu trả lời - nếu không có thiết lập ngược dòng lệnh này kết quả trong nói rằng không có thượng lưu đã được thiết lập. Chạy git branch --set-upstream master origin/<branch> để thiết lập ngược dòng nếu bạn có khuynh hướng sử dụng lệnh này để xem các cam kết được dàn dựng. - asyncwait
Điều này sẽ so sánh với chi nhánh mặc định trong nguồn gốc, không phải chi nhánh từ xa hiện tại. - greuze


Bí danh git tiện dụng để tìm kiếm các cam kết chưa được xóa trong hiện hành chi nhánh:

alias unpushed = !GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline

Điều này về cơ bản là:

git log origin/branch..branch

nhưng cũng xác định tên chi nhánh hiện tại.


36
2018-03-03 09:34



Điều này thật tuyệt! Đối với những người không quen với bí danh, chỉ cần thêm chúng vào tệp ~ / .gitconfig của bạn trong phần [bí danh]. - Gary Haran
Sao chép / dán trong bash không hoạt động, nhưng kịch bản khá hữu ích và dễ hiểu - greuze
Đây không phải là bí danh bash, như @GaryHaran chỉ ra. Có lệnh git để thêm bí danh: git alias <alias-name> <command> Trong trường hợp này, lệnh sẽ được bao quanh bởi dấu nháy đơn, để thoát khỏi các ký tự đặc biệt từ trình bao. - Dag Høidahl
Đó sẽ là: git config --global alias.unpushed '!GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline' - Ricky Levi


Bạn có thể thử....

gitk

Tôi biết nó không phải là một tùy chọn dòng lệnh thuần túy nhưng nếu bạn đã cài đặt nó và đang ở trên một hệ thống GUI thì đó là một cách tuyệt vời để xem chính xác những gì bạn đang tìm kiếm cộng thêm nhiều hơn nữa.

(Tôi thực sự rất ngạc nhiên khi không ai đề cập đến nó cho đến nay.)


30
2018-01-27 21:04



rất tuyệt. Không bao giờ biết rằng đã có. - Fraggle
điều này thật tuyệt vời, cảm ơn bạn! - 626
gitk --all để xem tất cả các nhánh. - Ray
tig là ncurses thay thế. - Ray