Как перебазировать коммиты одной ветки в 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)
После этого вы можете делать то, что вы хотите.