Làm thế nào để xác định khi nào một nhánh Git được tạo ra?


326

Có cách nào để xác định khi nào một nhánh Git được tạo không? Tôi có một chi nhánh trong repo của mình và tôi không nhớ việc tạo ra nó và nghĩ rằng có thể thấy dấu thời gian tạo sẽ chạy theo trí nhớ của tôi.


3
tìm thấy điều này rất hữu ích cho dòng
lệnhfu.com/commands/view/2345/ Kẻ

1
Khi bạn hỏi câu hỏi này, bạn có thực sự quan tâm đến việc lấy ngày và thời gian tạo chi nhánh hay bạn cũng muốn biết nơi nào trong lịch sử cam kết của bạn, chi nhánh được tạo ra lần đầu tiên, tức là chi nhánh của bạn được phân nhánh đầu tiên từ?

3
@Cupdding, câu hỏi khá rõ ràng. Tôi đã quan tâm khi tôi tạo ra chi nhánh. Điều đó nói rằng biết cam kết sẽ là thông tin hữu ích trong trường hợp chung.
paxos1977

Câu trả lời:


151

Sử dụng

git show --summary `git merge-base foo master`

Nếu bạn muốn nhìn thấy nó trong ngữ cảnh bằng gitk, thì hãy sử dụng

gitk --all --select-commit = `git merge-base foo master`

(trong đó foo là tên của chi nhánh bạn đang tìm kiếm.)

Ảnh chụp màn hình


24
Để làm rõ câu trả lời, có hai bước cho quy trình. (1) có được treesh bằng cách sử dụng "git merge-base <Branch> master" trong đó nhánh là nhánh quan tâm. (2) Sử dụng treesh làm đầu vào vào chương trình git để lấy ngày: "git show --summary <treesh>"
paxos1977

11
Câu trả lời này dường như ngoại trừ rằng nhánh đã được tạo từ chủ. Nhưng nếu nó không phải là trường hợp? Có cách nào để tìm cam kết đầu tiên của chi nhánh có nhiều hơn 1 con không?
Manitra Andriamitondra

20
Đây không phải là ngày mà chi nhánh được tạo ra - đây là cam kết "phân nhánh".
Marco

44
Giải pháp sẽ chỉ hoạt động nếu 'chi nhánh' không bao giờ được hợp nhất trở lại 'chủ'. Có cách nào để tìm cơ sở hợp nhất đầu tiên cho hai chi nhánh không?
Ilya Ivanov

22
Đây là hiển thị cơ sở hợp nhất, không tạo chi nhánh.
Hedley

138

Như đã chỉ ra trong các nhận xét và trong câu trả lời của Jackub , miễn là chi nhánh của bạn trẻ hơn số ngày được đặt trong cài đặt cấu hình gc.reflogexpire(mặc định là 90 ngày), thì bạn có thể sử dụng reflog của mình để tìm hiểu khi nào tham chiếu chi nhánh lần đầu tiên được tạo ra.

Lưu ý rằng git reflogcó thể mất hầu hết các git logcờ. Lưu ý thêm rằng các HEAD@{0}bộ chọn kiểu là các khái niệm hiệu quả về thời gian và trên thực tế, được xử lý (theo cách thức bị hack) dưới dạng chuỗi ngày. Điều này có nghĩa là bạn có thể sử dụng cờ --date=localvà nhận đầu ra như thế này:

$ git reflog --date = cục bộ
763008c ĐẦU @ {Thứ Sáu ngày 20 tháng 8 10:09:18 2010}: pull: Chuyển tiếp nhanh
f6cec0a ĐẦU @ {Thứ ba ngày 10 tháng 8 09:37:55 2010}: pull: Chuyển tiếp nhanh
e9e70bc ĐẦU @ {Thu ngày 4 tháng 2 02:51:10 2010}: pull: Chuyển tiếp nhanh
836f48c Head @ {Thu ngày 21 tháng 1 14:08:14 2010}: thanh toán: chuyển từ chủ sang chủ
836f48c ĐẦU @ {Thu ngày 21 tháng 1 14:08:10 2010}: kéo: Tiến nhanh
24bc734 ĐẦU @ {Thứ tư ngày 20 tháng 1 12:05:45 2010}: thanh toán: chuyển từ 74fca6a42863ffacaf7ba6f1936a9f228950f657 
74fca6a ĐẦU @ {Thứ tư ngày 20 tháng 1 11:55:43 2010}: thanh toán: chuyển từ chủ sang v2.6.31
24bc734 ĐẦU @ {Thứ tư ngày 20 tháng 1 11:44:42 2010}: kéo: Chuyển tiếp nhanh
964fe08 ĐẦU @ {Mon ngày 26 tháng 10 15:29:29 2009}: thanh toán: chuyển từ 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 
4a6908a ĐẦU @ {Mon ngày 26 tháng 10 14:51:12 2009}: thanh toán: chuyển từ chủ sang v2.6.28

Nó cũng có thể hữu ích vào những lúc sử dụng --date=relative:

$ git reflog --date = tương đối
763008c ĐẦU @ {4 tuần trước}: pull: Chuyển tiếp nhanh
f6cec0a ĐẦU @ {6 tuần trước}: pull: Chuyển tiếp nhanh
e9e70bc ĐẦU @ {8 tháng trước}: pull: Chuyển tiếp nhanh
836f48c ĐẦU @ {8 tháng trước}: thanh toán: chuyển từ chủ sang chủ
836f48c ĐẦU @ {8 tháng trước}: pull: Chuyển tiếp nhanh
24bc734 ĐẦU @ {8 tháng trước}: thanh toán: chuyển từ 74fca6a42863ffacaf7ba6f1936a9f228950f657 sang chủ
74fca6a ĐẦU @ {8 tháng trước}: thanh toán: chuyển từ chủ sang v2.6.31
24bc734 ĐẦU @ {8 tháng trước}: pull: Chuyển tiếp nhanh
964fe08 ĐẦU @ {11 tháng trước}: thanh toán: chuyển từ 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 sang chủ
4a6908a ĐẦU @ {11 tháng trước}: thanh toán: chuyển từ chủ sang v2.6.28

Một lưu ý cuối cùng: --allcờ (thực sự là cờ git-log được hiểu bởi git-reflog) sẽ hiển thị các reflog cho tất cả các ref được biết đến refs/(thay vì đơn giản, HEAD) sẽ hiển thị rõ cho bạn các sự kiện chi nhánh:

git reflog --date = local --all
860e4e4 refs / Heads / master @ {CN ngày 19 tháng 9 23:00:30 2010}: commit: Thứ hai.
17695bc refs / Heads / example_branch @ {Mon ngày 20 tháng 9 00:31:06 2010}: chi nhánh: Được tạo từ CHÍNH

3
Rất thú vị. +1. Cung cấp, tất nhiên, điều này diễn ra trong vòng gc.reflogexpirevài ngày.
VonC

2
@VonC - đúng rồi bạn. Giá trị mặc định cho gc.reflogExire là 90 ngày.
Aaron

1
Cuối cùng! câu trả lời duy nhất trong đó git tự nói: "nhánh: Được tạo từ ĐẦU". Vì vậy, thứ "chi nhánh" khó nắm bắt của Git CÓ THỂ được theo dõi đến ngày và thời gian tạo ra của nó ... Cảm ơn, giải thưởng +1. Nhưng những gì về điều gc.reflogExire đó, và làm thế nào để làm điều này trên các chi nhánh từ xa?
Motti Shneor

60

Pro Git § 3.1 Git Branching - What a Branch Is có một lời giải thích tốt về những gì một nhánh git thực sự là

Một nhánh trong Git chỉ đơn giản là một con trỏ di chuyển nhẹ để [a] commit.

Vì một nhánh chỉ là một con trỏ nhẹ, git không có khái niệm rõ ràng về lịch sử hoặc ngày tạo của nó. "Nhưng chờ đã," tôi nghe bạn nói, "dĩ nhiên git biết lịch sử chi nhánh của tôi!" Vâng, loại.

Nếu bạn chạy một trong những điều sau đây:

git log <branch> --not master
gitk <branch> --not master

bạn sẽ thấy những gì trông giống như "lịch sử chi nhánh của bạn", nhưng thực sự là một danh sách các cam kết có thể truy cập từ 'chi nhánh' không thể truy cập từ chủ. Điều này cung cấp cho bạn thông tin bạn muốn, nhưng nếu và chỉ khi bạn chưa bao giờ hợp nhất 'nhánh' trở lại thành chủ và chưa bao giờ sáp nhập chủ vào 'nhánh' kể từ khi bạn tạo. Nếu bạn đã hợp nhất, thì lịch sử của sự khác biệt này sẽ sụp đổ.

May mắn là reflog thường chứa thông tin bạn muốn, như được giải thích trong nhiều câu trả lời khác ở đây. Dùng cái này:

git reflog --date=local <branch>

để hiển thị lịch sử của chi nhánh. Mục cuối cùng trong danh sách này là (có thể) điểm mà bạn đã tạo chi nhánh.

Nếu nhánh đã bị xóa thì 'nhánh' không còn là định danh git hợp lệ, nhưng bạn có thể sử dụng thay thế này, có thể tìm thấy những gì bạn muốn:

git reflog --date=local | grep <branch>

Hoặc trong vỏ cmd của Windows:

git reflog --date=local | find "<branch>"

Lưu ý rằng reflog sẽ không hoạt động hiệu quả trên các chi nhánh từ xa, chỉ những người bạn đã làm việc tại địa phương.


Hmm, tôi không chắc câu trả lời này hữu ích như thế nào, tôi sẽ cần nghiên cứu thêm sau. Tuy nhiên, đối với những gì đáng giá, bạn chắc chắn đã làm rất tốt khi nỗ lực viết một cái gì đó toàn diện , và không chỉ là một câu trả lời ngắn gọn, lười biếng, vì vậy điều đó chắc chắn tốt. Ngoài ra, điều quan trọng cần lưu ý là bạn chỉ có thể sử dụng reflog cho điều này miễn là chi nhánh của bạn không cũ hơn gc.reflogexpirengày, như được chỉ ra trong câu trả lời nàycâu trả lời này .

4
Tôi không muốn sao chép tất cả thông tin tốt về reflog từ các câu trả lời khác, nhưng rất vui khi thêm gc.reflogExire nếu bạn nghĩ nó hữu ích. Câu trả lời của tôi nhằm mục đích (1) cung cấp rõ ràng hơn về nhánh git là gì và tại sao "lịch sử" của nó hơi mơ hồ, (2) đặt các lệnh hữu ích ở phía trước và trung tâm, bao gồm (3) hiển thị các cam kết trên một nhánh và không làm chủ và (4) grep-ing reflog cho một chi nhánh bị xóa. Phản hồi chào mừng.
yoyo

Cảm ơn @Cupdding. Thật thú vị, ban đầu tôi có các dấu ngoặc góc quanh 'nhánh' nhưng điều đó đã tước toàn bộ từ trong bản xem trước câu trả lời của tôi, vì vậy tôi cho rằng nó bị coi nhầm là html nội tuyến (không hợp lệ).
yoyo

Phương pháp này hoạt động tốt thông qua intellij và BitBucketgit reflog --date=local <branch>
isaac

40

Đầu tiên, nếu chi nhánh của bạn được tạo trong vòng gc.reflogexpirevài ngày (mặc định là 90 ngày, tức là khoảng 3 tháng), bạn có thể sử dụng git log -g <branch>hoặc git reflog show <branch>để tìm mục đầu tiên trong reflog, đó sẽ là sự kiện tạo và trông giống như bên dưới (for git log -g):

Reflog: <branch>@{<nn>} (C R Eator <creator@example.com>)
Reflog message: branch: Created from <some other branch>

Bạn sẽ nhận được ai đã tạo ra một chi nhánh, bao nhiêu hoạt động trước đây và từ chi nhánh nào (tốt, nó có thể chỉ là "Được tạo từ CHÍNH", không giúp được gì nhiều).

Đó là những gì MikeSep đã nói trong câu trả lời của mình .


Thứ hai, nếu bạn có nhánh dài hơn gc.reflogexpirevà bạn đã chạy git gc(hoặc nó được chạy tự động), bạn sẽ phải tìm tổ tiên chung với nhánh mà nó được tạo từ đó. Hãy xem tập tin cấu hình, có lẽ có branch.<branchname>.mergemục, nó sẽ cho bạn biết cái này dựa trên nhánh nào.

Ví dụ, nếu bạn biết rằng nhánh trong câu hỏi đã được tạo ra khỏi nhánh chính (ví dụ từ nhánh chính), bạn có thể sử dụng lệnh sau để xem tổ tiên chung:

git show $(git merge-base <branch> master)

Bạn cũng có thể thử git show-branch <branch> master, như là một thay thế.

Đây là những gì gbacon nói trong phản ứng của mình .


3
"git reflog show <Branch>" hoạt động tốt, hiển thị rất rõ ràng khi nhánh được tạo. Treesh đưa vào "chương trình git --summary <treesh>"
paxos1977

1
'Git log -g <chi nhánh>' là cái phù hợp với tôi - rất nhiều chi tiết. Cần phải ở trên chi nhánh để sử dụng bất kỳ trong số này.
Lidia

18

Tôi không chắc chắn về lệnh git cho nó, nhưng tôi nghĩ bạn có thể tìm thấy chúng trong các reflog.

.git/logs/refs/heads/<yourbranch>

Các tập tin của tôi dường như có dấu thời gian unix trong đó.

Cập nhật: Dường như có một tùy chọn để sử dụng lịch sử reflog thay vì lịch sử cam kết khi in nhật ký:

git log -g

Bạn cũng có thể theo dõi nhật ký này, trở lại khi bạn tạo chi nhánh. git logTuy nhiên, đang hiển thị ngày của cam kết, không phải là ngày mà bạn thực hiện hành động thực hiện một mục trong reflog. Tôi chưa tìm thấy điều đó ngoại trừ bằng cách tìm kiếm trong bản reflog thực tế trong đường dẫn trên.


12

Thử cái này

  git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'

3
bạn có thể cần %trước(refname)
Vor

1
@Vor Tôi đã thực hiện thay đổi
biniam

Tôi đã dẫn nó qua | cut -c 5- | sort -r | và sau đó chuyển qua grep trong tháng, đưa cho tôi một danh sách theo thứ tự thời gian đảo ngược, ít nhiều.
Noumenon

2
@Noumenon: for-Each-ref có thể sắp xếp cho bạn, bằng cách thêm ví dụ --sort='-committerdate'(lưu ý '-' trước committerdate cho thứ tự thời gian đảo ngược).
Pete

9

Sử dụng:

git reflog

để hiển thị tất cả chu kỳ sống của kho lưu trữ của bạn trong thư mục hiện tại. Tên chi nhánh xuất hiện đầu tiên (từ dưới lên) là nguồn được tạo.

855a3ce HEAD@{0}: checkout: moving from development to feature-sut-46
855a3ce HEAD@{1}: checkout: moving from feature-sut-46 to development
855a3ce HEAD@{2}: checkout: moving from feature-jira35 to feature-sut-46
535dd9d HEAD@{3}: checkout: moving from feature-sut-46 to feature-jira35
855a3ce HEAD@{4}: checkout: moving from development to feature-sut-46
855a3ce HEAD@{5}: checkout: moving from feature-jira35 to development
535dd9d HEAD@{6}: commit: insert the format for vendor specific brower - screen.css
855a3ce HEAD@{7}: checkout: moving from development to feature-jira35
855a3ce HEAD@{8}: checkout: moving from master to development

Đó có nghĩa là:

  • Phát triển chi nhánh được tạo ra (thanh toán -b) từ chủ

  • Nhánh tính năng-jira35 được tạo (thanh toán -b) từ quá trình phát triển

  • Nhánh tính năng-jira-sut-46 được tạo (thanh toán -b) từ quá trình phát triển


2
nhưng ngày tháng ở đâu? và bạn thấy việc trả phòng cho mọi chi nhánh nhiều lần. Có phải điều này chỉ có nghĩa là sự xuất hiện đầu tiên mà mỗi chi nhánh là sự sáng tạo của nó?
Motti Shneor

4

Đây là một cái gì đó mà tôi đã đưa ra trước khi tôi tìm thấy chủ đề này.

git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1
git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep 'branch:'

3

Lệnh này hiển thị ngày tạo chi nhánh devtừmain

$git reflog show --date=iso dev
$7a2b33d dev@{2012-11-23 13:20:28 -2100}: branch: Created from main

"ngày tạo chi nhánh" ... nếu dưới 90 ngày. Nếu nó đã được tạo ra nhiều hơn 90 ngày, thông tin đó sẽ được thanh lọc. Như đã đề cập ở trên trong stackoverflow.com/a/3748722/6309 .
VonC

@Sazzad Hissain Khan Người này làm việc cho chúng tôi vì chúng tôi muốn cung cấp 'mẹo ăn gian thân thiện' cho một số người không có kỹ thuật, những người đang bị lạc một chút với một số điều phức tạp của Git.
Chris22

2

Nếu bạn muốn có được các chi tiết cho tất cả các chi nhánh

for i in `git branch -r | tail -n +2 `;do git log --reverse $i|grep -A 2 -B 2 `echo $i | awk -F'origin/' '{print $2}'` |head -n 4; done

2

Tôi tìm thấy cách tốt nhất: Tôi luôn kiểm tra chi nhánh mới nhất được tạo bằng cách này

git for-each-ref --sort=-committerdate refs/heads/

1

Kết hợp với câu trả lời từ Andrew Sohn ( https://stackoverflow.com/a/14265207/1929406 )

branchcreated=$(git reflog show --date=format:'%Y-%m-%d %H:%M:%S' --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1| cut -d'{' -f 2| cut -d'}' -f 1 | xargs)
echo $branchcreated

1

Điều này đã làm điều đó cho tôi: (10 năm sau)

git log [--remotes] --no-walk --decorate

Vì không có thông tin được lưu trữ về thời gian tạo chi nhánh, điều này sẽ hiển thị cam kết đầu tiên của mỗi chi nhánh ( --no-walk), bao gồm ngày cam kết. Sử dụng --remotescho các chi nhánh từ xa, hoặc bỏ qua nó cho các chi nhánh địa phương.

Vì tôi thực hiện ít nhất một cam kết trong một chi nhánh trước khi tạo một cam kết khác, điều này cho phép tôi theo dõi lại một vài tháng sáng tạo chi nhánh (và tính năng bắt đầu phát triển) cho mục đích tài liệu.

nguồn: AnoE trên stackexchange


0

cú pháp: git reflog --date=local | grep checkout: | grep ${current_branch} | tail -1

thí dụ: git reflog --date=local | grep checkout: | grep dev-2.19.0 | tail -1

kết quả: cc7a3a8ec HEAD@{Wed Apr 29 14:58:50 2020}: checkout: moving from dev-2.18.0 to dev-2.19.0

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.