Git: получение последнего коммита на ветке - PullRequest
6 голосов
/ 19 января 2009

Я изо всех сил пытаюсь понять что-то о GIT.

У нас есть хранилище с несколькими ветками в нем. Я могу получить локальную копию одной из этих веток (git checkout -b ...), внести некоторые изменения и затем вернуть их обратно. Однако, если мне не удается пометить конец ветви, как другие пользователи получают заголовок ветви? Когда они используют git checkout для извлечения ветви, они получают код в точке ветви, а не в заголовке этой ветви.

Что мне здесь не хватает?

РЕДАКТИРОВАТЬ: Я пришел в этот проект поздно и был вовлечен в преобразование CVS в GIT. Я предполагаю, что FOO_3_4_0001 ... помечает все точки отметки вдоль ветви, начатой ​​с FOO_3_4_0001_INITIAL. Как я могу проверить?

РЕДАКТИРОВАТЬ 2: Спасибо всем, кто предоставил ответы. Оказывается, тега FOO_3_4_0001 не было в ветке 3.4, и это то, чего мне не хватало все время. Я уже устроил вечеринку линчевания.


@ ghoseb, не работал. Я попробовал это:

16:19:29 (1) foo $ git checkout --track -b FOO_3_4_0001_INITIAL origin/FOO_3_4_0001_INITIAL
Branch FOO_3_4_0001_INITIAL set up to track remote branch refs/remotes/origin/FOO_3_4_0001_INITIAL.
Switched to a new branch "FOO_3_4_0001_INITIAL"
16:19:36 (1) foo $ git branch
* FOO_3_4_0001_INITIAL
  master
16:19:39 (1) foo $ git pull
remote: Counting objects: 68, done.
remote: Compressing objects: 100remote: % (59/59), done.
remote: Total 61 (delta 18), reused 0 (delta 0)
Unpacking objects: 100% (61/61), done.
From ssh://***
   f0c5a5f..99f6c1e  master     -> origin/master
Already up-to-date.
16:19:42 (1) foo $

В этот момент я проверил изменения, внесенные в эту ветку, и ее там нет. Если я проверю код с меткой FOO_3_4_0001_RC5a, мое изменение там.


Хорошо, больше информации для @Dustin и @ mipadi. ​​

Когда я запускаю git branch -r, я вижу:

16:12:02 (1) foo $ git branch -r
  origin/FOO_3_3_0001_BUILT_VF_BRANCH
  origin/FOO_3_4_0001_INITIAL
  origin/FOO_3_5_0000_RC5
  origin/FOO_3_5_0001_BRANCH
  origin/HEAD
  origin/master
  origin/origin
16:12:05 (1) foo $

И если я посмотрю на список тегов, я вижу среди прочего:

16:12:05 (1) foo $ git tag -l
FOO_3_4_0000_RC1
FOO_3_4_0000_RC2
FOO_3_4_0000_RC2b
FOO_3_4_0000_RC3
FOO_3_4_0000_RC4
FOO_3_4_0000_RC4b
FOO_3_4_0000_RC5
FOO_3_4_0000_RELEASE
FOO_3_4_0000_TC1
FOO_3_4_0000_TC2
FOO_3_4_0001_RC2
FOO_3_4_0001_RC3
FOO_3_4_0001_RC4
FOO_3_4_0001_RC5
FOO_3_4_0001_RC5a
FOO_3_4_0001_TC1
16:14:33 (1) foo $

Задача, с которой я столкнулся, заключается в том, чтобы знать, какой последний код в ветке FOO_3_4_0001_INITIAL.

Теперь в этом случае я знаю, что это FOO_3_4_0001_RC5a, но если я не знаю (как это иногда бывает у некоторых наших разработчиков), как мне проверить, что ветка origin_FOO_3_4_0001_INITIAL знает, что у меня последний код в этой ветке?

Ответы [ 5 ]

8 голосов
/ 19 января 2009

Они могут просто извлечь из удаленного хранилища, чтобы получить HEAD удаленной ветви.

$ git remote update
$ git checkout <branch_name>
$ git pull origin <branch_name>
$ <edit> ...
$ git commit
$ git push origin <branch_name>

Я принял имя удаленного репозитория в качестве источника, вы можете заменить его фактическим именем.

4 голосов
/ 19 января 2009

Это звучит , как будто вы делаете правильные вещи. Имя ветви - это просто указатель на последний коммит в ветви. Вы уверены, что отправляете и , чтобы вернуть изменения в репо, из которого все тянут? Когда вы делаете коммит, вы только делаете на ваше локальное репо, поэтому чтобы получить изменения, коллаборации должны либо (а) извлечь из вашего локального репо, либо (б) вывести из другого доступного репо, в которое вы нажал на ваши изменения, используя git push.

1 голос
/ 19 января 2009

Git clone, pull и fetch работают со всем деревом репозитория. Ветви - это просто теги в вашем локальном хранилище.

Когда вы сделали клон, у вас есть копия удаленного репозитория в источнике. Вы можете получить к нему доступ, проверив его на месте.

git co -b origin_local_master origin

Это создает локальную редактируемую ветвь мастера источника.

Но вы также можете получить доступ к веткам внутри этого хранилища.

git co -b origin_local_dev origin/dev

Это создает локальную редактируемую ветвь с исходной веткой dev.

0 голосов
/ 15 января 2018

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

git rev-parse HEAD

и

git log -n 1 --pretty=format:"%H"  

попробуйте оба, они должны быть эквивалентны

0 голосов
/ 19 января 2009

Просто чтобы убедиться, что мы не упускаем из виду очевидное:

Когда вы вносите изменения, передаете ли вы их перед тем, как толкнуть их обратно? Ветви Git указывают на последний commit на ветке, поэтому, если изменения не были зафиксированы, тогда ветвь все равно будет указывать на точку ветвления, что, как вы сказали, происходит.

...