git revert проблема со стратегией слияния (их) - PullRequest
0 голосов
/ 01 декабря 2018

Я хочу вернуться к предыдущему коммиту ветки, взяв все изменения в этом коммите и ничего от текущего.

Я настроил свой тестовый каталог, как показано ниже:

mkdir test_dir
cd test_dir

git init .

touch a_file

git add a_file
git commit -am "file added."
# say commit id 0_afile

echo "1 line" >> a_file
git commit -am "1 line"
# say commit id 1_afile

echo "2 line" >> a_file
git commit -am "2 line"
# say commit id 2_afile

echo "3 line" >> a_file
git commit -am "3 line"
# say commit id 3_afile

echo "4 line" >> a_file
git commit -am "4 line"
# say commit id 4_afile

Когда я бегу git revert --no-edit -X theirs 2_afile.Я ожидаю, что содержимое 0_afile, 1_afile и 2_afile фиксируется, но результат не содержит содержимого 2_afile.Может ли кто-то указать, что я делаю неправильно.

1 Ответ

0 голосов
/ 01 декабря 2018

Мне это кажется несколько противоречивым:

Я хочу вернуть в предыдущий коммит ветви ...

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

... с учетом всех изменений в этом коммите и ничего из текущего.

Коммиты не изменения , коммиты состояний .

Чтобы использовать простой пример, предположим, что я говорю вам, что в настоящее время на улице 68 ° F (20 ° C), в пятницу.Это состояние .Если я спрошу вас, чем отличается вчерашняя температура, вы можете мне сказать?Что еще нужно знать в первую очередь?

Если температура поднимется на 9 ° F (5 ° C), это изменение .Если я скажу вам, что в понедельник по сравнению с воскресеньем он вырос так, какая температура была в воскресенье?Что еще мне нужно сказать вам в первую очередь?


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

Если вам нужно содержимое одного файла из предыдущего коммита, это просто;см. связанный вопрос, и это дубликат.То, что делает git revert, совершенно иное: оно превращает фиксацию - состояние - в изменение, а затем пытается применить это же изменение к состоянию current .См. Мой недавний ответ на Возврат, например, только одного файла отправленного коммита .

...