отправка нескольких несвязанных коммитов в удаленный репозиторий git - PullRequest
2 голосов
/ 08 июля 2011

У меня есть ситуация, когда я работаю над двумя разными проектами в определенной отрасли. Я закончил проект «А», зафиксировал изменение и перенес изменение в пульт. Это изменение "A" в настоящее время пересматривается, поэтому оно еще не было объединено с веткой. Тем временем я начал работать над несвязанным изменением для другого проекта в той же ветке, назовите это изменение "B". Я также закончил кодировать это изменение, и я готов зафиксировать и подтолкнуть это. Но я не уверен, как это сделать, так как изменение «А» еще не было объединено. Как я могу выдвинуть эти два изменения «A» и «B» как отдельные изменения, которые не зависят друг от друга?

Ответы [ 2 ]

3 голосов
/ 08 июля 2011

Сначала вам нужно определить коммит, который будет общим родителем изменений A и B. Как вы уже описали, это родитель родительского комита A. Используйте git log, чтобы найти хеш для коммита до A.Обратите внимание, что вы можете просто ввести первые несколько букв / цифр хеша коммита.Давайте представим, что это «parent_commit»

Теперь извлеките этот коммит, который мы собираемся использовать в качестве заголовка новой ветви для Изменения B.

git checkout parent_commit

Затем создайте новую ветку изэто, где мы будем фиксировать изменения B.

git checkout -b changeB

Наконец, используйте git add и git commit, чтобы зафиксировать изменения B в этой новой ветви.Когда закончите, выполните git push, чтобы вытолкнуть ваш коммит B из вашей новой ветви, независимой от изменения A. В качестве альтернативы, если вы уже зафиксировали Изменение B, тогда используйте git cherry-pick commitB, а затем git pull.

Теперь у вас будет исходная ветвь с A и новая ветвь с B, делящая историю до родителя A.

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

git rebase --onto master commit_A_sha
0 голосов
/ 08 июля 2011

По существу тот же результат, что и ответ Шелхамера; но вы можете использовать git rebase --onto для достижения того же результата в одной команде. Найдите идентификатор SHA «старого» родителя (в вашем примере A) и идентификатор SHA нового родителя (скажем, master ). Затем, предположив, что у вас есть ветвь, о которой идет речь (B), выполните:

git rebase --onto <new parent> <old parent>

Это, по сути, "подхватит" все в ветви B, начиная с A, и переместит его так, чтобы оно основывалось на главном. Тогда просто git push как обычно.

...