Làm thế nào để liệt kê các nhánh có chứa một cam kết nhất định?


1088

Làm cách nào tôi có thể truy vấn git để tìm ra nhánh nào chứa một xác nhận đã cho? gitkthường sẽ liệt kê các nhánh, trừ khi có quá nhiều, trong trường hợp đó nó chỉ nói "nhiều (38)" hoặc đại loại như thế. Tôi cần biết danh sách đầy đủ, hoặc ít nhất là liệu một số nhánh nhất định có chứa cam kết hay không.



Câu hỏi liên quan cho một cam kết tương đương trên mỗi nhận xét: stackoverflow.com/questions/16304574/ cấp
UpAndAdam

Câu trả lời:


1471

Từ trang hướng dẫn chi nhánh git :

 git branch --contains <commit>

Chỉ liệt kê các nhánh có chứa cam kết được chỉ định (CHÍNH nếu không được chỉ định). Ngụ ý --list.


 git branch -r --contains <commit>

Liệt kê các nhánh theo dõi từ xa (như được đề cập trong câu trả lời của người dùng3941992 bên dưới) đó là "các nhánh cục bộ có mối quan hệ trực tiếp với một nhánh từ xa".


Xem thêm bài viết này git sẵn sàng .

Các --containsthẻ sẽ tìm ra nếu một số cam kết đã được đưa vào chưa thành chi nhánh của bạn. Có lẽ bạn đã có một SHA cam kết từ một bản vá mà bạn nghĩ rằng bạn đã áp dụng hoặc bạn chỉ muốn kiểm tra xem cam kết cho dự án nguồn mở yêu thích của bạn có giảm 75% mức sử dụng bộ nhớ hay không.

$ git log -1 tests
commit d590f2ac0635ec0053c4a7377bd929943d475297
Author: Nick Quaranto <nick@quaran.to>
Date:   Wed Apr 1 20:38:59 2009 -0400

    Green all around, finally.

$ git branch --contains d590f2
  tests
* master

Lưu ý: nếu cam kết nằm trên nhánh theo dõi từ xa , hãy thêm -atùy chọn .
(như bình luận của MichielB bên dưới )

git branch -a --contains <commit>

MatrixFrog nhận xét rằng nó chỉ hiển thị các nhánh chứa cam kết chính xác đó .
Nếu bạn muốn biết những nhánh nào chứa một cam kết "tương đương" (tức là những nhánh nào đã chọn cam kết đó) git cherry:

git cherry so sánh các thay đổi thay vì id xác nhận (sha1) , bạn có thể sử dụng git cherryđể tìm hiểu xem một cam kết bạn đã thực hiện cục bộ có được áp dụng <upstream>theo một id xác nhận khác không.
Ví dụ: điều này sẽ xảy ra nếu bạn đang cung cấp các bản vá <upstream>qua email thay vì đẩy hoặc kéo cam kết trực tiếp.

           __*__*__*__*__> <upstream>
          /
fork-point
          \__+__+__-__+__+__-__+__> <head>

(Ở đây, các cam kết được đánh dấu ' -' sẽ không xuất hiện git cherry, nghĩa là chúng đã có mặt <upstream>.)


3
testsmaster- masterlà nhánh hiện tại, do đó dấu hoa thị.
xanh

54
Điều này chỉ cho thấy những nhánh chứa cam kết chính xác đó . Nếu bạn muốn biết nhánh nào chứa một cam kết "tương đương" (nghĩa là nhánh nào có cherry đã chọn cam kết đó) git cherry: "Bởi vì git cherry so sánh các thay đổi thay vì id id (sha1), bạn có thể sử dụng git cherry để tìm hiểu nếu một cam kết bạn thực hiện cục bộ đã được áp dụng <ngược dòng> dưới một id cam kết khác. Ví dụ: điều này sẽ xảy ra nếu bạn đang cung cấp các bản vá <ngược dòng> qua email thay vì đẩy hoặc kéo cam kết trực tiếp. " kernel.org/pub/software/scm/git/docs/git-cherry.html
MatrixFrog

62
Thêm một -atham số để kiểm tra các chi nhánh từ xa.
Raman

28
Bạn cũng có thể làm git tag --contains <commit>. Xem Tìm kiếm tất cả các thẻ có chứa một cam kết? .
Andrew Marshall

5
Về git cherryphần @UpAndAdam đã đặt câu hỏi tại đây: stackoverflow.com/questions/16304574/ Lời , than ôi, câu hỏi chưa (chưa) được trả lời.
adeelx

22

Bạn có thể chạy:

git log <SHA1>..HEAD --ancestry-path --merges

Từ nhận xét của cam kết cuối cùng trong đầu ra, bạn có thể tìm thấy tên chi nhánh ban đầu

Thí dụ:

       c---e---g--- feature
      /         \
-a---b---d---f---h---j--- master

git log e..master --ancestry-path --merges

commit h
Merge: g f
Author: Eugen Konkov <>
Date:   Sat Oct 1 00:54:18 2016 +0300

    Merge branch 'feature' into master

6
Đẹp! Tôi đã từng git log <SHA1>..master --ancestry-path --merges --oneline | tail -n1có được điều này trong một dòng
James EJ

1
Nếu bạn muốn sử dụng lệnh git thuần túy, bạn có thể sử dụng:git log <SHA1>..master --ancestry-path --merges --oneline -1
Bartosz

Lưu ý: Khi cam kết của bạn là cam kết gần đây nhất trên nhánh chính / foo (CHÍNH) ... bạn không thể thực hiện một A..Bphạm vi cam kết, chỉ không sử dụng một phạm vi như vậy :: git log HEAD --oneline -1> 82c12a9 (HEAD, origin/remote-branch-name, origin/master, origin/dev, origin/HEAD, master, dev) commit message.
Devin G Rhode

Nếu git repo này là một mô hình con và bạn đang cố gắng giải quyết vấn đề CHÍNH tách rời ... thì bạn có một câu hỏi khó về một nhánh ưa thích ... Trong ví dụ trước của tôi, bạn có thể dễ dàng nói rằng masterluôn được ưu tiên nếu nó nằm trong danh sách này . Từ đó, nó ít rõ ràng hơn. Bạn có thể thử và đọc nhánh git từ tệp .gitmodules : git config -f .gitmodules submodule.src/foo/submodule.branch. Đây có thể là một ngã ba dài / pr. Bạn có thể cd để repo root và chạy git config submodule.src/foo/submodule.branch. Bạn cũng có thể sử dụng nhánh git hiện tại.
Devin G Rhode

Bỏ qua một bên: git config submodule.src/foo/submodule.branchCó thể bị ảnh hưởng bởi bất kỳ cấu hình git nào, bao gồm tệp .gitconfig repo-local. (yêu cầu chạy git config --local include.path ./path/to/your/.gitconfig)
Devin G Rhode
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.