Lệnh để nhận mã băm cam kết Git mới nhất từ ​​một nhánh [đã đóng]


84

Làm cách nào để kiểm tra bằng dòng lệnh, mã băm cam kết mới nhất của một nhánh Git cụ thể?


1
Bạn đã thử sử dụng 'git log -n 1' khi bạn đã kiểm tra chi nhánh cụ thể đó chưa?
Rick van Bodegraven,

git log cung cấp hàm băm trong kho lưu trữ cục bộ, nhưng kho lưu trữ trung tâm git có hàm băm mới.
mbdvg

1
git log -n 1 [branch_name]branch_name (có thể là chi nhánh từ xa hoặc cục bộ) là tùy chọn. Nếu không có branch_name, nó sẽ hiển thị cam kết mới nhất của chi nhánh hiện tại.
Rahul Tapali

11
Với số phiếu đóng như thế này, SO đang trở thành Wikipedia.
Eric Walker

Xem thêm tại đây .
Raphael

Câu trả lời:


60

Sử dụng git ls-remote git://github.com/<user>/<project>.git. Ví dụ: dự án trac-backlog của tôi cung cấp:

:: git ls-remote git://github.com/jszakmeister/trac-backlog.git
5d6a3c973c254378738bdbc85d72f14aefa316a0    HEAD
4652257768acef90b9af560295b02d0ac6e7702c    refs/heads/0.1.x
35af07bc99c7527b84e11a8632bfb396823326f3    refs/heads/0.2.x
5d6a3c973c254378738bdbc85d72f14aefa316a0    refs/heads/master
520dcebff52506682d6822ade0188d4622eb41d1    refs/pull/11/head
6b2c1ed650a7ff693ecd8ab1cb5c124ba32866a2    refs/pull/11/merge
51088b60d66b68a565080eb56dbbc5f8c97c1400    refs/pull/12/head
127c468826c0c77e26a5da4d40ae3a61e00c0726    refs/pull/12/merge
2401b5537224fe4176f2a134ee93005a6263cf24    refs/pull/15/head
8aa9aedc0e3a0d43ddfeaf0b971d0ae3a23d57b3    refs/pull/15/merge
d96aed93c94f97d328fc57588e61a7ec52a05c69    refs/pull/7/head
f7c1e8dabdbeca9f9060de24da4560abc76e77cd    refs/pull/7/merge
aa8a935f084a6e1c66aa939b47b9a5567c4e25f5    refs/pull/8/head
cd258b82cc499d84165ea8d7a23faa46f0f2f125    refs/pull/8/merge
c10a73a8b0c1809fcb3a1f49bdc1a6487927483d    refs/tags/0.1.0
a39dad9a1268f7df256ba78f1166308563544af1    refs/tags/0.2.0
2d559cf785816afd69c3cb768413c4f6ca574708    refs/tags/0.2.1
434170523d5f8aad05dc5cf86c2a326908cf3f57    refs/tags/0.2.2
d2dfe40cb78ddc66e6865dcd2e76d6bc2291d44c    refs/tags/0.3.0
9db35263a15dcdfbc19ed0a1f7a9e29a40507070    refs/tags/0.3.0^{}

Chỉ cần grep cho cái bạn cần và cắt nó ra:

:: git ls-remote git://github.com/jszakmeister/trac-backlog.git | \
   grep refs/heads/master | cut -f 1
5d6a3c973c254378738bdbc85d72f14aefa316a0

Hoặc, bạn có thể chỉ định tham chiếu nào bạn muốn trên dòng lệnh và tránh grep với:

:: git ls-remote git://github.com/jszakmeister/trac-backlog.git refs/heads/master | \
   cut -f 1
5d6a3c973c254378738bdbc85d72f14aefa316a0

Lưu ý: nó không nhất thiết phải là git://URL. Nó có thể là https://hoặc git@github.com:quá.

Ban đầu, điều này nhằm mục đích tìm ra cam kết mới nhất của một nhánh từ xa (không chỉ từ lần tìm nạp cuối cùng của bạn mà còn là cam kết mới nhất thực tế trong nhánh trên kho lưu trữ từ xa). Nếu bạn cần băm cam kết cho một cái gì đó cục bộ, câu trả lời tốt nhất là:

git rev-parse branch-name

Nó nhanh chóng, dễ dàng và một lệnh duy nhất. Nếu bạn muốn băm cam kết cho nhánh hiện tại, bạn có thể xem HEAD:

git rev-parse HEAD

4
Mong muốn tình yêu nhiều hơn. Điều này hoạt động tuyệt vời.
SuperFamousGuy

git rev-parse my_branch_nameHOẶC git log -n 1 my_branch_name | grep commit | awk '{ print $2 }'câu trả lời đơn giản hơn; sẽ chỉ xuất ra mã băm cam kết cuối cùngmy_branch_name
betoharres

@betoharres OP ban đầu đang cố gắng xác định cam kết trên một kho lưu trữ từ xa (không phải những gì chúng tôi có trong đó refs/remotes, mà là kho lưu trữ từ xa thực tế). git rev-parse branch-namechắc chắn là cách để đi đến một chi nhánh địa phương.
John Szakmeister,

Điều này chỉ hoạt động trong trường git svnbởi vì git svn fetchthay đổi git logđầu ra và vì vậy git logkhông còn có thể được sử dụng để lấy băm cam kết kho lưu trữ git từ xa cuối cùng .
Andry

@Andry Tôi không chắc ý của bạn ... Tôi gặp sự cố khi theo dõi nhận xét của bạn. Bạn có thể giải thích thêm?
John Szakmeister

139
git log -n 1 [branch_name]

branch_name(có thể là chi nhánh từ xa hoặc cục bộ) là tùy chọn. Nếu không branch_name, nó sẽ hiển thị cam kết mới nhất trên nhánh hiện tại.

Ví dụ:

git log -n 1
git log -n 1 origin/master
git log -n 1 some_local_branch

git log -n 1 --pretty=format:"%H"  #To get only hash value of commit

20
git log -n 1 --pretty = format: "% H" hoạt động hoàn hảo đối với tôi
Jaro

9
Nhận băm ngắn: 'git rev-phân tích cú pháp --short --verify my_branch' từ câu hỏi tương tự: stackoverflow.com/a/949391/134761
angularsen

Thật tuyệt, tôi đã thêm cái này vào .gitconfig của mình để tôi có thể sao chép lần cam kết cuối cùng với git hash | pbcopy clip `` `[alias] hash ="! F () {\ git log -n 1 --pretty = format: "% H"; \}; f"` ``
quần

2

Hãy thử sử dụng git log -n 1sau khi thực hiện a git checkout branchname. Điều này hiển thị mã băm cam kết, tác giả, ngày tháng và thông báo cam kết cho cam kết mới nhất.

Thực hiện git pull origin/branchnamelần đầu tiên, để đảm bảo repo cục bộ của bạn khớp ngược dòng.

Nếu có lẽ bạn chỉ muốn xem danh sách các cam kết mà chi nhánh cục bộ của bạn ở phía sau trên chi nhánh từ xa, hãy làm như sau:

git fetch origin
git cherry localbranch remotebranch

Điều này sẽ liệt kê tất cả các băm của các cam kết mà bạn chưa hợp nhất vào chi nhánh địa phương của mình.


yêu cầu của tôi là kiểm tra kho lưu trữ cục bộ và kho lưu trữ github commit hash giống nhau hay không, làm cách nào chúng ta có thể làm điều này?
mbdvg

Theo như tôi biết, không có cách nào mà các băm cam kết có thể khác nhau giữa đại diện cục bộ và đại diện từ xa của bạn cho các cam kết giống nhau. Có lẽ ý bạn là danh sách các cam kết mà kho lưu trữ cục bộ của bạn bị thiếu so với kho lưu trữ từ xa?
Rick van Bodegraven,

Có Rick van, có một không phù hợp, vì vậy, tôi muốn chứng minh rằng có một sự khác biệt trong repo địa phương và github, Vì vậy, cần một cách để tìm hiểu
mbdvg

2

bạn có thể git fetch nameofremoterepo, sau đógit log

và cá nhân tôi, tôi bí danh gitlogđể git log --graph --oneline --pretty --decorate --all. thử và xem nó có phù hợp với bạn không


Và git fetch vẫn chưa kéo các thay đổi
nglinh

--onlinelà cách viết tắt của --pretty=oneline --abbrev-commit. Nhưng bạn cũng đang sử dụng --pretty, nó sẽ hoàn nguyên --pretty=oneline... Tôi muốn giới thiệu git log --graph --abbrev-commit --decorate --allthay thế.
Felix Kling

Mát mẻ. Tôi không nhận thấy điều đó. Cảm ơn!
nglinh 30/03/2013

0

Trong một bình luận bạn đã viết

tôi muốn chứng minh rằng có sự khác biệt trong repo cục bộ và github

Như đã được đề cập trong một câu trả lời khác, bạn nên làm git fetch origintrước. Sau đó, nếu điều khiển từ xa đi trước chi nhánh hiện tại của bạn, bạn có thể liệt kê tất cả các cam kết giữa chi nhánh cục bộ và điều khiển từ xa với

git log master..origin/master --stat

Nếu chi nhánh địa phương của bạn đang ở phía trước:

git log origin/master..master --stat

--stat hiển thị danh sách các tệp đã thay đổi.

Nếu bạn muốn liệt kê rõ ràng các bổ sung và xóa, hãy sử dụng git diff:

git diff master origin/master

0

Lưu ý rằng khi sử dụng tùy chọn "git log -n 1 [branch_name]". -n chỉ trả về một dòng nhật ký nhưng thứ tự được trả về không được đảm bảo. Sau đây là trích xuất từ ​​trang git-log man

.....
.....
Commit Limiting

Besides specifying a range of commits that should be listed using the special notations explained in the     description, additional commit limiting may be applied.

Using more options generally further limits the output (e.g. --since=<date1> limits to commits newer than <date1>, and using it with --grep=<pattern> further limits to commits whose log message has a line that matches <pattern>), unless otherwise noted.

Note that these are applied before commit ordering and formatting options, such as --reverse.

-<number>
-n <number>
.....
.....
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.