Git: лучший способ удалить все изменения из данного файла для одной ветви - PullRequest
12 голосов
/ 17 марта 2012

У меня немного грязная ветка с 20 или около того коммитами, и я готовлюсь к слиянию с мастером. Я отклонил его от мастера и, присмотревшись к нему, я понимаю, что есть файлы, которые модифицируются способами, которые абсолютно не имеют отношения к этой ветке и не готовы к фиксации. Изменения в этих файлах не ограничиваются конкретными коммитами.

Так что, в принципе, я не хочу, чтобы эти файлы были включены в эту ветку, если это возможно. Есть ли хороший способ пойти по этому поводу? Моя запасная позиция № 1, очевидно, состоит в том, чтобы просто скопировать последнюю копию каждого из этих файлов, а затем зафиксировать. Но тогда история все равно будет содержать изменения, и боги мерзавцев будут хмуриться на меня.

Отступить назад # 2 - сделать то же самое, а затем раздавить всю историю ветвлений до одного коммита.

Есть какие-нибудь улучшения?

Ответы [ 4 ]

17 голосов
/ 17 марта 2012

Скажите, что ваша история

$ git lola
* 6473d7f (master) Update
| * 9bcfa7e (HEAD, topic) Munge a, b, and c
| * 99af942 Munge b and c
| * 8383e2c Munge a and b
|/
* d1363f4 Baseline

Примечание: lola - нестандартный, но полезный псевдоним.

В коммитах были изменены три разных файла.

$ git log --decorate=short --pretty=oneline --name-status topic
9bcfa7e946a92c226ad50ce430a9e4ae55b32490 (HEAD, topic)
M       a
M       b
M       c
99af942dbb922effcad8a72e96bec9ee9afcc437 Munge b and c
M       b
M       c
8383e2c8d6092550fec13d3c888c037b3a68af15 Munge a and b
M       a
M       b
d1363f4fba67d94999b269b51bdb50a8a68ba27a Baseline
A       a
A       b
A       c

Изменения в файле b - это те, которые вы хотите сохранить, и вы хотите отменить все изменения в a и c. Один из способов сделать это с помощью git filter-branch.

$ git checkout -b tmp topic
Switched to a new branch 'tmp'

$ git merge-base topic master
d1363f4fba67d94999b269b51bdb50a8a68ba27a

$ git filter-branch --tree-filter 'git checkout d1363f -- a c' master..tmp
Rewrite 8383e2c8d6092550fec13d3c888c037b3a68af15 (1/3)
Rewrite 99af942dbb922effcad8a72e96bec9ee9afcc437 (2/3)
Rewrite 9bcfa7e946a92c226ad50ce430a9e4ae55b32490 (3/3)
Ref 'refs/heads/tmp' was rewritten

Вышеупомянутый фильтр дерева проверяет коммиты в именованном диапазоне и восстанавливает файлы a и c для содержимого на & ldquo; базе слияния, & rdquo; то есть коммит, при котором topic отошел от master.

Теперь tmp содержит все topic изменений на b, но никаких изменений в любом другом файле нет.

$ git log --decorate --pretty=oneline --name-status tmp
9ee7e2bd2f380cc338b0264686bcd6f071eb1087 (HEAD, tmp) Munge a, b, and c
M       b
226c22f150af1ddc1f9adc19f97fc4f220851ada Munge b and c
M       b
45e706f7b22c37ee2025ee0d04c651135e7b31cd Munge a and b
M       b
d1363f4fba67d94999b269b51bdb50a8a68ba27a Baseline
A       a
A       b
A       c

В качестве меры предосторожности git filter-branch хранит резервную копию вашего исходного исх. Если вы удовлетворены своими изменениями и хотите удалить резервную копию tmp, запустите

$ git update-ref -d refs/original/refs/heads/tmp
0 голосов
/ 04 июня 2018

У меня как пользователя Windows возникло несколько проблем:

  1. Использовать двойные кавычки для команды --tree-filter.
  2. Использовать косую черту для пути к файлу.
  3. Не запускайте путь к файлу с косой чертой.

Вот как выглядит моя команда:

git filter-branch -f --tree-filter "git checkout a59f75 -- source/_posts/blog1.md source/_posts/blog2.md" master..tmp
0 голосов
/ 17 марта 2012

Чтобы перейти к определенной версии, вы можете сделать git checkout <sha1> <file>, где sha1 - уникальный хэш sha1 той версии, в которой вы хотите, чтобы файл был.

0 голосов
/ 17 марта 2012

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

git apply -R

Примечание IЯ никогда не делал этого ... но теоретически это должно сработать.: -)

...