Как перебазировать коммиты одной ветки в Git?

Я сделал неправильный перебазирование и разрешение конфликтов в Git, поэтому я оказался в этой глупой ситуации:

*   8379515 (HEAD, origin/master, origin/HEAD, master) Merge branch 'binary-mobile'
|\
| * 21b247a (binary-mobile) Add Binary Mobile
| * c66dced Add Music Collection
* | cbbe364 Add task Music Collection
|/
* 8e9ccae Update README.md
* 31d2050 Reorganize repo and add README files
* 88fe4fd Rename readme file
* 8ed72bd Reorganize the structure of the repo
* 219a25a Update README.md
* 60921e6 Create README.md
* 1de4f36 Initial commit

Моя проблема в том, что совершает Add task Music Collection а также Add Music Collection подобные. Я бы хотел:

  • пусть моя ветвь будет следовать по одному пути;
  • только один коммит с заголовком Add Music Collection,

Могу ли я просто сделать git rebase -i 8e9ccae а затем сквош c66dced в cbbe364 и переименовать cbbe364 в Add Music Collection? Я думаю, что проблема, во-первых, заключалась в том, что я выдвинул коммиты, которые я хотел перебазировать, на Github, но я подумал, что, пока никто с ними не работает, это нормально?

3 ответа

Решение

Я хотел бы сделать что-то вроде:

  • вернуться к точке, где коммиты в порядке
  • создайте там ветку и выберите нужные коммиты
  • git сбрасывается в начальную точку ветки, это станет вашим новым мастером / головой, но вы сохранили ваши промежуточные коммиты
  • слить ветку и готово!:)

Так что в коде это будет что-то вроде:

git checkout 8e9ccae
git checkout -b better_changes
git cherry-pick c66dced
git cherry-pick 21b247a
git checkout master
git reset --hard HEAD^6  //check correct nr of steps with git reflog
git merge better_changes

А потом заставь толкнуть к началу:)

Я бы сделал следующее, если бы я застрял с этой проблемой:

1.) Перебазировать коммиты между cbbe364 (эксклюзив) и 21b247a (включительно) на ваш 8e9ccae,

git rebase --onto 8e9ccae cbbe364 21b247a

Это перемещает коммиты c66dced а также 21b247a прямо на 8e9ccae, Это приведет к другому хеш-значению для новейшего коммита Add Binary Mobile, назовем хеш-значение 'commit2'(дерево может быть не точным на 100%, у него нет репозитория git для его воспроизведения)

*   8379515 (HEAD, origin/master, origin/HEAD, master) Merge branch 'binary-mobile'
|\
| * 21b247a (binary-mobile) Add Binary Mobile
| * c66dced Add Music Collection
| | cbbe364 Add task Music Collection
|/
|
|
| * commit2 (HEAD) Add Binary Mobile
| * commit1 Add Music Collection
|/
* 8e9ccae Update README.md
* 31d2050 Reorganize repo and add README files
* 88fe4fd Rename readme file
* 8ed72bd Reorganize the structure of the repo
* 219a25a Update README.md
* 60921e6 Create README.md
* 1de4f36 Initial commit

2.) После этого переместите master вниз (вниз по "дереву") к commit2:

git branch -d master
git checkout commit2
git branch master

| * commit2 (HEAD, master) Add Binary Mobile
| * commit1 Add Music Collection
|/
* 8e9ccae Update README.md

3.) Теперь у вас есть master где он принадлежит, а именно на commit2, Если вы хотите следовать своей ветке в "одной строке", вам нужно избавиться от binary-mobile филиал, просто удалите его:

git branch -D binary-mobile

Потому что совершить 21b247a теперь не имеет имени ветви, и вы не работаете с этой веткой (без HEAD), ветка исчезнет.

4.) В конце концов внесите изменения (в этом случае необходима сила). Это переместит ваш origin/master до masterи ветвь слияния должна исчезнуть.

git push master --force


* commit2 (HEAD, master, origin/master) Add Binary Mobile
* commit1 Add Music Collection
* 8e9ccae Update README.md
* 31d2050 Reorganize repo and add README files
* 88fe4fd Rename readme file
* 8ed72bd Reorganize the structure of the repo
* 219a25a Update README.md
* 60921e6 Create README.md
* 1de4f36 Initial commit

Если я вас правильно понимаю, вам нужно просто проверить и отменить то, что вы сделали неправильно.

С git reflog ( См. Здесь) вы можете проверить историю всего, что вы сделали с помощью вашего git-репозитория. Все эти изменения хранятся в git, поэтому вы можете вернуться в любое состояние, в котором находился ваш репозиторий за предыдущие 2 месяца.

С git reset --hard HEAD@{NumberOfTheChange} ( См. Здесь) вы можете отменить любые изменения в хранилище. (Но учтите, что таким образом вы не можете отменить изменения в файлах, которые не отслеживались git)

После этого вы можете делать то, что вы хотите.

Другие вопросы по тегам