2015-11-19 5 views
4

У меня есть ветка my-feature, которая подталкивается к исходному коду для проверки кода. Это не используется. В конце концов он будет слит в мой филиал develop, который является общим среди моей команды. Я хотел бы переустановить свою ветку develop в my-feature, чтобы сохранить историю чище, а затем объединить ветвь моей функции в разработке. Это то, что я делал:после git rebase мой филиал и удаленная ветка расходятся

$ git checkout my-feature 
// do some work. make commits. 

$ git rebase develop 
// fix some conflicts 

$ git add . 

$ git rebase --continue 

После того как я нормированный успешно, проверить статус:

$ git status 
On branch my-feature 
Your branch and 'origin/my-feature' have diverged, 
and have 155 and 1 different commit each, respectively. 
    (use "git pull" to merge the remote branch into yours) 

$ git what do I do here? 

У меня есть к идее, что делать здесь. Если я git pull, то я заметил, что у меня появятся конфликты, которые не имеют смысла. Некоторые люди говорят, чтобы заставить толчок, но я нервничаю по этому поводу. Нормально ли принудительно нажимать мою ветку темы на происхождение? Пока никто другой не использует эту ветку?

ответ

7

Во-первых, вы можете сделать git push --force на данном этапе без каких-либо забот: Вы сказали, что ваши ветвь не используется.
Таким образом, изменение его истории на стороне сервера не повлияет на других пользователей.

Во-вторых, когда вы перебазироваться ветку, вы меняете его общего предка из с удаленного филиала отслеживания (origin/xxx)

Перед git rebase develop, у вас есть

d--d--d (develop) 
    \ 
    x--x--x--x--x--X--y--y--y (my-feature) 
        | 
     (origin/my-feature) 

X является общим предком между происхождения/функция и функция, которая просто означает, что вы добавили несколько коммитов в свою ветку my-feature).
Статус, мерзавец возвращает что-то вроде:

On branch my-feature 
Your branch is ahead of 'origin/my-feature' by 3 commit. 

Но когда вы перебазироваться эту ветвь на вершине develop, вы переигрывать все коммиты из my-feature на вершине разработки HEAD

 X--X--X--X--X--X--Y--Y--Y (my-feature) 
    /
d--D--d (develop) 
    \ 
    x--x--x--x--x--X 
        | 
     (origin/my-feature) 

Этот время, общий предок между my-feature и origin/my-feature больше не является добавленным фиксатором, но полная история my-feature, плюс некоторые фиксации develop! (D здесь)

Поэтому статус

Your branch and 'origin/my-feature' have diverged, 
and have 155 and 1 different commit each, respectively. 

Поскольку ваш филиал не является общим, опять же, простой git push --force origin my-feature завершит операцию:

 X--X--X--X--X--X--Y--Y--Y (my-feature, origin/my-feature) 
    /
d--D--d (develop) 

(Если my-feature имеет входную ветвь , достаточно git push --force, при условии, что default push policy push.default is set to simple.
Check that с git rev-parse --abbrev-ref --symbolic-full-name @{u})

+0

отличное объяснение. И тогда я могу объединить свою «функцию» в '' develop'' без каких-либо последствий? – Jeff

+0

@Jeff да слияние будет тривиальным быстрым слиянием. – VonC

+1

@ VonC В зависимости от версии git кто-то использует git push -force немного рискованно. До git 1.9.5 поведение git по умолчанию для pushing заключалось в том, чтобы выталкивать каждую ветку из вашего локального репозитория. Так что еще лучше определить ветвь явным: git push --force origin Eruvanos

2

Что вы видите, что my-feature действительно отличается от origin/my-feature (что моя-функция выглядела как о происхождении вы в последний раз проверил), потому что вы только что изменили my-feature (мой-функции вы работаете с), когда вам сделал rebase.

Когда вы делаете rebase, вы меняете историю ветки, так что вам почти всегда понадобится --force push afterwards. Это нормально, если это ваш филиал, и нет каких-либо соавторов, использующих эту ветку.

Если у этой ветви функции есть соавторы, то вы не должны были иметь переустановку для начала. Общее эмпирическое правило - не изменять историю общих ветвей. Если это так, вам нужно отменить rebase, о котором вы можете обратиться к this post за помощью.

+0

Спасибо. В этом есть смысл. Иногда я не знаю, будет ли филиал сотрудником или нет, поэтому мне было интересно, существует ли передовая практика для разделения ветви функции, которая была переустановлена. Полагаю, я мог бы начать новую ветку, и вишня выберет коммиты, которые я хочу на новую ветку. – Jeff

+1

Если он уже был общим, то не переустанавливайте. Если вы откажетесь перед тем, как кто-либо возьмет это, тогда вы в порядке. Как правило, вы должны знать, безопасно ли перезагрузка или нет для вашей ситуации. – jready

1

Предположим, вы следующие GIT зафиксированной-структуры:

A--B--C--D--E(origin/my-feature) 
\ 
    F--G--H--I(someotherbranch) 

если вы сейчас перебазироваться origin/my-feature на someotherbranch то есть следующие ситуации:

A--B--C--D--E(origin/my-feature) 
\ 
    F--G--H--I(someotherbranch) 
      \ 
      B'--C'--D'--E'(my-feature) 

, что ситуация diverging. my-feature в другой ветке, чем origin/my-feature, и вы не можете fast-forward любой из этих ветвей. Теперь, если origin/my-feature не доставлен никаким человеком, вы можете безопасно push -f. Но если кто-то его потянул, у вас могут возникнуть проблемы, если этот человек продолжит работать в этой ветке. Убедитесь, что любой человек, который потянул ваш неправильный origin/my-feature, изменил ли он голову ветви на вашу вынужденную фиксацию.

Всегда следовать правилу: Не Rebase любой толкаемых коммита.

Плохое положение:

   J--K--G(origin/otherperson) 
      /
A--B--C--D--E(origin/my-feature) 
\ 
    F--G--H--I(someotherbranch) 
      \ 
      B'--C'--D'--E'(my-feature) 

Это должно быть затем изменено на:

A--B--C--D--E(origin/my-feature) (orphaned if push-f) 
\ 
    F--G--H--I(someotherbranch) 
      \ 
      \    J'--K'--G'(origin/otherperson) 
       \   /
       B'--C'--D'--E'(my-feature) 
Смежные вопросы