git: журнал git между удаленной ветвью и HEAD, находящимся в состоянии detached HEAD

git checkout -t происхождение/5.0

* df957e8 (HEAD, origin/5.0, 5.0) commit A
* 93f3185 commit B
* abd1176 commit C

Я проверил изменение от gerrit, используя команду ниже

git fetch gerrit refs/changes/36/236/1 && git checkout FETCH_HEAD

Теперь он переходит в состояние detached HEAD с входящими фиксациями поверх основной ветки вместо 5.0.

    * bdd7f9c (HEAD) part 3 of 236
    * fa8f60f part 2 of 236
    * bddd168 part 1 of 236
    * ffc7982 (origin/master, origin/HEAD) commit master
    * 415668e 
    * 991d48d 

Я хочу, чтобы это было похоже

* bdd7f9c (HEAD) part 3 of 236
* fa8f60f part 2 of 236
* bddd168 part 1 of 236
* df957e8 (HEAD, origin/5.0, 5.0) commit A
* 93f3185 commit B
* abd1176 commit C

Я попытался изменить HEAD, указывающий на refs/heads/5.0, используя symbolic-ref, но сразу после проверки FETCH_HEAD он отображается поверх основной ветки вместо 5.0.

Моя цель - получить список коммитов, полученных из проверки изменений gerrit, с помощью команды

"git log --format="%H" происхождение/5.0..HEAD"

но в этом случае он не работает, так как проверяется поверх мастера вместо 5.0.

Пожалуйста, дайте мне знать, если я что-то упустил


person Sridhar    schedule 18.02.2014    source источник


Ответы (1)


Здесь происходит несколько вещей. Во-первых, в желаемом результате у вас не может быть двух HEAD. Всегда есть только один HEAD.

Вы получаете состояние отсоединенной головы, когда на вашу текущую головную фиксацию не ссылается ни одно имя ветки или тег.

Теперь о том, почему коммиты помещаются поверх master, а не 5.0. Каждый коммит ссылается на родительский коммит. то есть каждый отдельный коммит имеет родителя, на который ссылается его хэш. Когда вы извлекаете изменения, извлеченные коммиты также приходят со своими родительскими ссылками и размещаются соответствующим образом. Например, предположим, что следующее состояние вашего удаленного репо:

A -> B -> C (C — последняя фиксация)

И у вас есть следующая история в вашем локальном:

A -> B

Теперь независимо от того, из какой ветки вы извлекаете или извлекаете, когда будет получен коммит C, он будет искать там коммит B set camp.

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

Если вам все еще нужно переместить эти 3 коммита, я предлагаю вам заглянуть в rebase. Хотя перебазирование публичных коммитов, безусловно, укусит вас, если только вы не являетесь единственным участником репо.

person Akash    schedule 18.02.2014
comment
Спасибо, Акаша, за объяснение. Я предположил, что в той же ветке были внесены герритные изменения, и я не исследовал эту точку зрения. Ваш ответ заставил меня проверить родителя этих коммитов, и теперь я понял. Спасибо за ваше время. - person Sridhar; 19.02.2014