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