Как зафиксировать изменения в новой ветке

166

Я только что внес изменения в ветку. Как я могу зафиксировать изменения в другой ветке?

Я пытаюсь использовать:

git checkout "the commmit to the changed branch" -b "the other branch"

Однако я не думаю, что это правильно, потому что в этом случае я создаю новую ветку вместо того, чтобы фиксировать изменения в «другой ветке».

Следует ли мне использовать вместо этого следующую команду?

git merge "the other branch"
user1988385
источник
Всего один коммит или несколько?
Карл Норум

Ответы:

289

git checkout -b your-new-branch

git add <files>

git commit -m <message>

Сначала проверьте свою новую ветку. Затем добавьте все файлы, которые хотите зафиксировать в постановке. Наконец, зафиксируйте все файлы, которые вы только что добавили. Возможно, вы захотите сделать git push origin your-new-branchпозже, чтобы ваши изменения отображались на пульте дистанционного управления.

Джон Броди
источник
1
так как я получил новую ветку из git checkout v3.0 (ветка до того, как я внес изменения) new-branch, мне все еще нужно использовать «git add <files>»?
user1988385 01
Вы можете сделать, git statusчтобы увидеть, что в настоящее время поставлено, а что нет.
Джон Броди
5
Почему оба git addи git commit -a?
Карл Норум
11
Это не git checkout -b your-new-branchвместо git checkout your-new-branch?
Schrodinger's'Cat
1
как насчет того, чтобы я уже отслеживал файлы и хочу переключиться на новую ветку, добавить эти файлы во вновь созданную ветку?
задница-король какой-то вопрос
67

Если вы не зафиксировали изменения

Если ваши изменения совместимы с другой веткой

Это случай из вопроса, потому что OP хочет зафиксировать в новой ветке, а также применяется, если ваши изменения совместимы с целевой ветвью, не вызывая перезаписи.

Как и в принятом ответе Джона Броди, вы можете просто проверить новую ветку и зафиксировать работу:

git checkout -b branch_name
git add <files>
git commit -m "message"

Если ваши изменения несовместимы с другой веткой

Если вы получили сообщение об ошибке:

error: Your local changes to the following files would be overwritten by checkout:
...
Please commit your changes or stash them before you switch branches

Затем вы можете спрятать свою работу, создать новую ветку, затем внести изменения в свой тайник и разрешить конфликты:

git stash
git checkout -b branch_name
git stash pop

Все будет так, как если бы вы внесли эти изменения после создания новой ветки. Затем вы можете зафиксировать как обычно:

git add <files>
git commit -m "message"

Если вы зафиксировали изменения

Если вы хотите сохранить коммиты в исходной ветке

См. Ответ Карла Норума о сборе вишен, который в данном случае является правильным инструментом:

git checkout <target name>
git cherry-pick <original branch>

Если вы не хотите сохранять коммиты в исходной ветке

См. Ответ joeytwiddle на этот потенциальный дубликат . При необходимости выполните любой из вышеуказанных шагов, затем откатите исходную ветку:

git branch -f <original branch> <earlier commit id>

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

мигельморин
источник
3
Каждый должен попробовать этот код. Потому что большинство людей, которые ищут ответ, уже внесли некоторые изменения в ваш существующий код.
Sushin Pv
2
Зачем вы добавили тайник и тайник? Когда вы проверяете новую ветку, ваши изменения будут доступны для добавления и фиксации, нет необходимости хранить их.
Тристан
@Tristan Вы правы в том случае, когда изменения совместимы и файлы не перезаписываются. В противном случае я получаю сообщение « error: Your local changes to the following files would be overwritten by checkout: ... Please commit your changes or stash them before you switch branches.Вы хотите написать новый ответ или отредактировать мой ответ?» Если нет, то могу отредактировать сам.
miguelmorin
Хорошо, вы совершенно правы. Я думаю, вам следует дополнить свой ответ, чтобы показать, что он приносит в дополнение к принятому ответу.
Тристан
@ Тристан Я сделал это. OP спрашивал о новой ветке, и в этом случае принятый ответ правильный. Я сохраняю свой, потому что другие люди сочли мой ответ полезным. Это стало длинным ответом, и я буду рад редактировать любые отзывы.
miguelmorin
26

Если я правильно понимаю, вы сделали фиксацию changed_branchи хотите скопировать ее other_branch? Легко:

git checkout other_branch
git cherry-pick changed_branch
Карл Норум
источник
5
Это правильный ответ на то, чего он пытается достичь.
Шон