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.
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.
Câu trả lời:
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ỉ 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 reflog
có thể mất hầu hết các git log
cờ. 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=local
và 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: --all
cờ (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
gc.reflogexpire
vài ngày.
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.
gc.reflogexpire
ngày, như được chỉ ra trong câu trả lời này và câu trả lời này .
git reflog --date=local <branch>
Đầu tiên, nếu chi nhánh của bạn được tạo trong vòng gc.reflogexpire
và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.reflogexpire
và 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>.merge
mụ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 .
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 log
Tuy 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.
Thử cái này
git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'
%
trước(refname)
| 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.
--sort='-committerdate'
(lưu ý '-' trước committerdate cho thứ tự thời gian đảo ngược).
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
Đâ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:'
Lệnh này hiển thị ngày tạo chi nhánh dev
từmain
$git reflog show --date=iso dev
$7a2b33d dev@{2012-11-23 13:20:28 -2100}: branch: Created from main
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
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/
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
Đ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 --remotes
cho 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