Git pull до определенной фиксации

96

Я хочу сделать, git pullно только до определенной фиксации.

 A->B->C->D->E->F (Remote master HEAD)

Итак, предположим, моя local masterГОЛОВА указывает на B, а я хочу тянуть до E. Что я должен делать ?

Это не подтягивание конкретной фиксации, это подтягивание к определенной фиксации.

Ниндзя420
источник
3
git fetchи git merge E.
тыкает
Например, я сейчас нахожусь в B, но я хочу потянуть только C, E и F. Я хочу удалить D. Спасибо!
Frenkey
@Frenkey, вы можете объединить мастер, затем удалить последние три коммита, а затем выбрать последние два. Также вы можете попробовать rebase -i для более контролируемого слияния git
Ninja420
что, если я хочу получить изменения только из C, а не включать изменения A и B только в C? Как я могу это сделать?
Викас Чаухан,

Ответы:

113

git pullне что иное, как git fetchза которым следует git merge. Итак, что вы можете сделать, это

git fetch remote example_branch

git merge <commit_hash>

unrealsoul007
источник
Что должно означать «Обратитесь к этому»?
developerbmw
@Brett Забыл разместить ссылку .. удалил ее полностью
unrealsoul007
@ unrealsoul007, это объединит только этот конкретный коммит, верно? Итак, чтобы потянуть от B до E, команда будет выглядеть так: git merge <commit_hash C> <commit_hash D> <commit_hash E>, верно?
Wim Feijen 01
6
@WimFeijen git merge Eобъединится Eвместе со всеми своими предками Cи D(git знает это, Aи Bего не нужно объединять, потому что они уже были в вашей ветке). Если вы ТОЛЬКО хотите изменений, Eвам следует git cherry-pick Eвместо этого.
neXus
Спасибо, ребята, за ответ, я искал ту же проблему.
Акаш Бисария,
21

Сначала получите последние коммиты из удаленного репо. Это не повлияет на ваш местный филиал.

git fetch origin

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

git checkout origin/master
git log

Возьмите хеш коммита, который вы хотите объединить (или только первые ~ 5 символов), и объедините этот коммит с мастером.

git checkout master
git merge <commit hash>
разработчикbmw
источник
1
Я проголосовал против вас, потому что это не работает так, как рекламируется. Прежде всего, с помощью вашего метода "git fetch origin" он извлекает все удаленные ветки (на это следует указывать явно, особенно для людей, работающих в проектах с большим количеством крупных веток). Во-вторых, с помощью этого метода "git merge <commit hash>" не объединяет вашу локальную историю до желаемой фиксации, если вы вернулись в историю. Пример: вы находитесь локально на фиксации 100, вы хотите получить до 150, извлекая все (с удаленным HEAD на 100).
Placeholder
8
@Placeholder вы должны прочитать инструкцию, git fetchпрежде чем писать такую ​​ерунду. Кроме того, вы должны прочитать исходный вопрос и мой ответ. Если вы последуете моему ответу, вы не вернетесь «назад в историю», как я прямо указываю пользователю git checkout master. В целом, пожалуйста, не публикуйте материалы, если вы не на 50% понимаете, что делаете.
developerbmw
1
В случае, если это не очевидно для кого-либо, git fetch originявно извлекает происхождение .
Дэниел Фаррелл
2
Это отлично работает и лучше объяснено, чем принятый ответ.
walen
1
Лучший ответ, сработал
отлично
13

Вы также можете вытащить последнюю фиксацию и просто отменить ее, пока не появится желаемая фиксация:

git pull origin master
git reset --hard HEAD~1

Замените masterнужной веткой.

Используйте git log, чтобы увидеть, к какой фиксации вы хотите вернуться:

git log

Лично мне это сработало лучше.

По сути, это извлекает последнюю фиксацию, и вы вручную откатываете коммиты один за другим. Используйте git log, чтобы увидеть историю коммитов.

Хорошие моменты: работает как рекламируется. Вам не нужно использовать хеш фиксации или извлекать ненужные ветки.

Плохие моменты: вам нужно откатывать коммиты по одному.

ВНИМАНИЕ: Зафиксируйте / сохраните все ваши локальные изменения, потому что --hardвы потеряете их. Используйте на свой риск!

Заполнитель
источник
3
Я не знаю, почему отрицательные голоса, это кажется самым чистым способом, и как только вы захотите узнать последнюю информацию, подойдет простое извлечение, в отличие от некоторых других ответов
Маурисио Паскье Хуан
Почему бы и не получить больше голосов, единственный недостаток в том, что вам нужно перейти к предыдущему варианту, HEADпрежде чем возвращаться - и я не знаю, что бы произошло, если бы вам пришлось разрешать конфликты. Но это решение позволяет git pull --rebaseи вопреки тому, что было сказано, вы можете напрямую вернуться к предыдущим Nкоммитам с помощью git reset --hard HEAD~N(т.е. для 3 коммитов git reset --hard HEAD~3).
Stock Overflaw
2

Если вы объедините коммит в свою ветку, вы должны получить всю историю между ними.

Обратите внимание:

$ git init ./
Инициализированный пустой репозиторий Git в /Users/dfarrell/git/demo/.git/
$ echo 'a'> письмо
$ git добавить письмо
$ git commit -m 'Начальная буква'
[master (root-commit) 6e59e76] Начальная буква
 1 файл изменен, 1 вставка (+)
 создать режим 100644 письма
$ echo 'b' >> буква
$ git add letter && git commit -m 'Добавление буквы'
[master 7126e6d] Добавление письма
 1 файл изменен, 1 вставка (+)
$ echo 'c' >> буква; git add letter && git commit -m 'Добавление буквы'
[master f2458be] Добавление письма
 1 файл изменен, 1 вставка (+)
$ echo 'd' >> письмо; git add letter && git commit -m 'Добавление буквы'
[master 7f77979] Добавление письма
 1 файл изменен, 1 вставка (+)
$ echo 'e' >> letter; git add letter && git commit -m 'Добавление буквы'
[master 790eade] Добавление письма
 1 файл изменен, 1 вставка (+)
$ git журнал
совершить 790eade367b0d8ab8146596cd717c25fd895302a
Автор: Дэн Фаррелл 
Дата: 16 июля, 14:21:26 2015 -0500

    Добавление письма

совершить 7f77979efd17f277b4be695c559c1383d2fc2f27
Автор: Дэн Фаррелл 
Дата: 16 июля, 14:21:24 2015 -0500

    Добавление письма

совершить f2458bea7780bf09fe643095dbae95cf97357ccc
Автор: Дэн Фаррелл 
Дата: 16 июля, 14:21:19 2015 -0500

    Добавление письма

совершить 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Автор: Дэн Фаррелл 
Дата: 16 июля, 14:20:52 2015 -0500

    Добавление письма

совершить 6e59e7650314112fb80097d7d3803c964b3656f0
Автор: Дэн Фаррелл 
Дата: 16 июля, 14:20:33 2015 -0500

    Начальная буква
$ git checkout 6e59e7650314112fb80097d7d3803c964b3656f
$ git checkout 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Примечание: проверка '7126e6dcb9c28ac60cb86ae40fb358350d0c5fad'.

Вы находитесь в состоянии «отключенная ГОЛОВА». Можно осмотреться, поэкспериментировать
изменения и зафиксировать их, и вы можете отказаться от любых коммитов, сделанных в этом
состояние, не влияя на какие-либо ветки, выполнив еще одну проверку.

Если вы хотите создать новую ветку для сохранения созданных вами коммитов, вы можете
сделайте это (сейчас или позже), снова используя -b с командой checkout. Пример:

  git checkout -b имя_новой_ветки

HEAD теперь на 7126e6d ... Добавление письма
$ git checkout -b B 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Перешел на новую ветку "Б"
$ git pull 790eade367b0d8ab8146596cd717c25fd895302a
фатальный: '790eade367b0d8ab8146596cd717c25fd895302a' не похоже на репозиторий git
фатальный: не удалось прочитать из удаленного репозитория.

Убедитесь, что у вас есть правильные права доступа
и репозиторий существует.
$ git merge 7f77979efd17f277b4be695c559c1383d2fc2f27
Обновление 7126e6d..7f77979
Перемотка вперед
 письмо | 2 ++
 1 файл изменен, 2 прошивки (+)
$ кошка письмо
а
б
c
d
Дэниел Фаррелл
источник
1

Это работает для меня:

git pull origin <sha>

например

[dbn src]$ git fetch
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 7 different commits each, respectively.
...
[dbn src]$ git log -3 --pretty=oneline origin/master
f4d10ad2a5eda447bea53fed0b421106dbecea66 CASE-ID1: some descriptive msg
28eb00a42e682e32bdc92e5753a4a9c315f62b42 CASE-ID2: I'm so good at writing commit titles
ff39e46b18a66b21bc1eed81a0974e5c7de6a3e5 CASE-ID2: woooooo
[dbn src]$ git pull origin 28eb00a42e682e32bdc92e5753a4a9c315f62b42
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 1 different commits each, respectively.
...

Это тянет 28eb00, ff39e4 и все, что было раньше, но не тянет f4d10ad. Он позволяет использовать pull --rebase и учитывает настройки pull в вашем gitconfig. Это работает, потому что вы в основном рассматриваете 28eb00 как ветку.

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

[dbn src]$ git pull origin `git rev-parse origin/master^`
dbn
источник