Команда для получения последнего хэша коммита Git из ветки [закрыто]

88

Как я могу проверить с помощью командной строки последний хеш-код фиксации конкретной ветки Git?

mbdvg
источник
1
Пробовали ли вы использовать git log -n 1, когда проверяли эту конкретную ветку?
Рик ван Бодегравен
git log дает хэш локальных репозиториев, но репозиторий git hub имеет новый хеш.
mbdvg
1
git log -n 1 [branch_name]branch_name (может быть удаленной или локальной веткой) необязательно. Без имени ветки будет отображаться последняя фиксация текущей ветки.
Рахул Тапали
11
Таким образом, SO становится Википедией.
Эрик Уокер
Смотрите также здесь .
Рафаэль

Ответы:

62

Используйте git ls-remote git://github.com/<user>/<project>.git. Например, мой проект trac-backlog дает:

:: 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^{}

Просто наберите тот, который вам нужен, и вырежьте его:

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

Или вы можете указать, какие ссылки вы хотите в командной строке, и избежать grep с помощью:

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

Примечание: это не обязательно должен быть git://URL. Это могло быть https://или git@github.com:тоже.

Первоначально это было направлено на обнаружение последней фиксации удаленной ветки (не только из вашей последней выборки, но и фактической последней фиксации в ветке в удаленном репозитории). Если вам нужен хеш фиксации для чего-то локально, лучший ответ:

git rev-parse branch-name

Это быстро, легко и с помощью одной команды. Если вам нужен хеш фиксации для текущей ветки, вы можете посмотреть HEAD:

git rev-parse HEAD
Джон Закмейстер
источник
4
Заслуживает большей любви. Это прекрасно работает.
SuperFamousGuy
git rev-parse my_branch_nameИЛИ git log -n 1 my_branch_name | grep commit | awk '{ print $2 }'более простой ответ; выведет только последний хэш фиксацииmy_branch_name
betoharres
@betoharres, OP изначально пытался определить фиксацию в удаленном репозитории (не то, что у нас есть refs/remotes, а фактическое удаленное репо). git rev-parse branch-nameопределенно способ пойти в местный филиал.
John Szakmeister
Это работает только в поле, git svnпотому что git svn fetchизменяет git logвывод и поэтому git logбольше не может использоваться для получения хэша последней удаленной фиксации репозитория git.
Andry
@Andry Я не понимаю, что вы имеете в виду ... У меня проблемы с отслеживанием вашего комментария. Вы можете объяснить больше?
Джон Закмейстер
142
git log -n 1 [branch_name]

branch_name(может быть удаленным или локальным филиалом) не является обязательным. Без branch_nameнего будет отображаться последняя фиксация в текущей ветке.

Например:

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" отлично работает для меня
Jaro
9
Получите короткий хеш: 'git rev-parse --short --verify my_branch' из аналогичного вопроса: stackoverflow.com/a/949391/134761
angularsen
Хорошо, я добавил это в свой .gitconfig, чтобы я мог просто скопировать последнюю фиксацию с помощью " git hash | pbcopy clip ` [alias] hash = "! F () {\ git log -n 1 --pretty = format:"% H "; \}; f "` ``
Штаны
2

Попробуйте использовать git log -n 1после выполнения git checkout branchname. Это показывает хеш фиксации, автора, дату и сообщение фиксации для последней фиксации.

Выполните git pull origin/branchnameсначала, чтобы убедиться, что ваше локальное репо соответствует восходящему потоку.

Если, возможно, вы хотели бы видеть только список коммитов, которые ваша локальная ветка находится за удаленной веткой, сделайте следующее:

git fetch origin
git cherry localbranch remotebranch

Здесь будут перечислены все хэши коммитов, которые вы еще не слили в свою локальную ветку.

Рик ван Бодегравен
источник
Мое требование - проверить, совпадают ли хэши фиксации локальных репозиториев и репозиториев github или нет, как мы можем это сделать?
mbdvg
Насколько мне известно, хэши коммитов не могут отличаться между вашим локальным и удаленным репо для одних и тех же коммитов. Возможно, вы имели в виду, что список коммитов отсутствует в вашем локальном репозитории, а не в удаленном?
Рик ван Бодегравен
Да, Рик Ван, есть несоответствие, поэтому я хочу показать, что есть разница в локальном репозитории и репозитории github, поэтому нужен способ узнать
репозитории и репозитории на
2

вы можете git fetch nameofremoterepo, тоgit log

и лично я псевдоним gitlogдля git log --graph --oneline --pretty --decorate --all. попробуйте и посмотрите, подходит ли он вам

нглин
источник
И git fetch пока не
извлекает
--onlineэто сокращение от --pretty=oneline --abbrev-commit. Но вы тоже используете --pretty, который возвращается --pretty=oneline... Я бы рекомендовал git log --graph --abbrev-commit --decorate --allвместо этого.
Феликс Клинг,
Круто. Я этого не заметил. Благодаря!
nglinh
0

В вашем комментарии

Я хочу показать, что есть разница в локальном и github репозитории

Как уже упоминалось в другом ответе, вы должны сделать git fetch originсначала. Затем, если пульт находится впереди вашей текущей ветки, вы можете перечислить все коммиты между вашей локальной веткой и удаленным с помощью

git log master..origin/master --stat

Если ваше местное отделение впереди:

git log origin/master..master --stat

--stat показывает также список измененных файлов.

Если вы хотите явно перечислить добавления и удаления, используйте git diff:

git diff master origin/master
Феликс Клинг
источник
0

Обратите внимание, что при использовании параметра «git log -n 1 [имя_ ветки]». -n возвращает только одну строку журнала, но порядок, в котором она возвращается, не гарантируется. Ниже приводится выдержка из справочной страницы git-log.

.....
.....
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>
.....
.....
bhav22
источник