Как объединить ветку в git, которая удаляла файлы в master все время, оставляя удаленные файлы нетронутыми в master ветке? - PullRequest
0 голосов
/ 08 апреля 2020

Как объединить ветку в git, которая все время удаляла файлы в master, сохраняя при этом удаленные файлы нетронутыми в основной ветке?

Например, в моей тестовой ветке я удалил папку с именем / sounds и в моем мастере у меня также есть эта папка / sounds, как я могу объединить мою тестовую ветку с главной и сохранить папку / sounds?

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Ключом к пониманию этого является признание нескольких фактов:

  • Файлы не являются в ветвях. Файлы находятся в коммитах .
  • Коммитом слияния является коммит .
  • Каждый коммит сохраняет полный снимок всех файлов.
  • Файлы, которые находятся в новом коммите, который вы делаете - включая новый коммит слияния - происходят из файлов, которые находятся в Git s index во время вашего запуска git commit или git merge --continue.

Следовательно, если git merge собирается сделать коммит, который вам не нравится, вы можете сделать одну из двух вещей:

  • Позвольте сделать коммит, который вам не нравится, затем добавьте второй коммит, чтобы исправить его.
  • Или: убедитесь, что git merge еще не сделал коммит пока, используя git merge --no-commit. Слияние прекратится до совершения. Затем настройте индекс так, чтобы он содержал файлы (и версии этих файлов), которые вы хотите отображать в коммите.

Если ваш вопрос о механике получения некоторых файл (ы) из какого-либо коммита (ов), чтобы поместить его в следующий коммит, эта часть становится тривиальной, когда вы понимаете, что такое коммит и что делает Git. Например, предположим, что вы делаете это:

git checkout master

git checkout -b otherbranch
git rm -r sounds
git commit

git checkout master
git merge otherbranch

Это фактически делает коммит слияния, при условии, что нет никаких конфликтов слияния (не будет), и новый коммит слияния не хватает sounds/ файлы. Но почему это важно? Вы хотите вернуть звуковые файлы, просто возьмите их с коммита, который идет за один шаг до нового коммита слияния, вдоль «основной» строки:

git checkout master~1 -- sounds/

, а затем сделайте new commit:

git commit

, который расширяет master еще одним коммитом снова. Новый коммит имеет те же файлы, что и коммит merge, за исключением того, что он также содержит также все файлы sounds/.

Выполнение слияния при сохранении файлов дает то, что некоторые Назовите зло слияния (см. Зло сливается в git? ), но это также просто. Замените шаг git merge на:

git merge --no-commit otherbranch
git checkout HEAD -- sounds/
git merge --continue

, и вы сделаете коммит слияния, который не удалит файлы sounds/, потому что он скопировал все файлы sounds/ из коммит, который был вершиной master всего на мгновение go, прежде чем вы сделали новый коммит слияния.

0 голосов
/ 08 апреля 2020

Восстановите файлы в ветви, затем объедините их.

git checkout test
git restore --source master sounds
git add sounds
git commit

git diff master теперь не должно показывать никаких изменений в sounds/. Теперь объединитесь как обычно.

Если вы не можете изменить эту ветку, создайте из нее новую ветвь, восстановите и объедините эту ветку.

git checkout test
git checkout -b test2
...then restore as above...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...