Git: заставить рабочее дерево соответствовать ссылке

Мне интересно, есть ли команда git для обновления рабочего дерева, чтобы она соответствовала конкретной ссылке (например, ветки).

По сути, я ищу эквивалент более ручной git diff -R branch | patch -p1 git diff -R branch | patch -p1, это также немного точнее - оставляя изменения, поставленные как "Изменения, которые необходимо совершить" (как сказал бы статус git), и пропускать что-либо вроде фиксации пробелов и т.д.

Кажется, что нужно выполнить git reset, но я не вижу никакой возможности влиять только на рабочее дерево, не изменяя также историю фиксации.

Для ясности я хочу сделать это, пока в середине слияния. т.е.

$ git merge -s ours --no-commit otherbranch
$ git diff -R branch-i-already-did-the-merge-in | patch -p1
$ git add -A .
$ git commit
4 ответа

Теперь лучше понять требования немного лучше.

Вам нужно использовать некоторые команды сантехники, чтобы выполнить то, что вы хотите.

git commit-tree позволит вам создать фиксацию из произвольного ранее существующего дерева с любыми родителями, которые вы хотите указать. Вы передаете команду фиксации и используйте ^ {дерево}, чтобы ссылаться на дерево из нее. Родители передаются, указывая "-p SHA" для каждого родителя. commit-tree не будет обновлять текущую головку/плечо, поэтому для этого мы используем update-ref. Таким образом, чтобы создать новый коммит с древовидным содержимым раздела branch-i-already-done-the-merge-in, с первым parent = current HEAD и 2-м parent = otherbranch, используйте следующее. Поскольку вы используете уже существующее дерево, обработка пробелов не должна происходить.

git update-ref HEAD $(echo "Merge Comment" | git commit-tree -p HEAD -p otherbranch branch-i-already-did-the-merge-in^{tree} -F -


Ваш вопрос все еще несколько запутан. Вы говорите, что хотите, чтобы изменения отображались как "изменения, которые необходимо совершить" (что означает изменение индекса), но затем вы выполняете его с "воздействием на рабочее дерево, а не на индекс", что означает "изменения, не поставленные для фиксации",

Если вы хотите, чтобы файлы были поставлены, используйте это

git reset --hard SHA && git reset --soft ORIG_HEAD

Если вы хотите, чтобы они находились в рабочем каталоге, удалите только "--soft".

git reset --hard SHA && git reset ORIG_HEAD


Использовать временный индекс:

GIT_INDEX_FILE=/tmp/tmptmpindex git reset
GIT_INDEX_FILE=/tmp/tmptmpindex git reset --hard branch .
rm /tmp/tmptmpindex

Обычные предостережения об reset --hard которые опасны, все еще применяются.


Я думаю, что вы ищете checkout с опцией пути

Вы можете перейти к корневому пути вашего репозитория и выполнить:

git checkout <anotherref> .
</anotherref>

(Обратите внимание на точку в конце). Это установит вашу рабочую копию с содержимым другого ref, обратите внимание, что любое неактивное содержимое в WC будет перезаписано (или проверка может быть отклонена, чтобы избежать перезаписывания неуправляемых изменений), возможно, вы хотите скрыть ваши изменения сначала через git stash

licensed under cc by-sa 3.0 with attribution.