Git pull до певного коміту


97

Я хочу зробити, git pullале лише до конкретного коміту.

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

так припустимо, що моя local masterГОЛОВА вказує на B, і я хочу тягнути до E. Що я повинен зробити ?

Це не тягне конкретний коміт, це тягнеться до конкретного коміту.



3
git fetchі git merge E.
тикати

На даний момент я зараз у В, але я хочу витягнути лише C, E та F. Я хочу видалити D. Дякую!
Френкі

@Frenkey, ви можете зробити злиття майстра, потім видалити останні три коміти, а потім вибрати останні два. Також ви можете спробувати rebase -i для більш контрольованого злиття git
Ninja420

що робити, якщо я хочу отримати лише зміни з C, не включати зміни A і B просто C? Як я можу це зробити?
Вікас Чауган

Відповіді:


114

git pullне є нічим іншим, як git fetchслідує git merge. Отже, що ви можете зробити, це

git fetch remote example_branch

git merge <commit_hash>


Що повинно бути "Посилання на це"?
developerbmw

@Brett Забув опублікувати посилання .. повністю видалив його
unrealsoul007

@ unrealsoul007 це об’єднає лише один конкретний коміт, чи не так? Отже, щоб витягнути з B до E, команда буде git merge <commit_hash C> <commit_hash D> <commit_hash E> так?
Вім Фейен

6
@WimFeijen git merge Eоб’єднається Eразом із усіма своїми предками Cі D(git це знає Aі Bне потрібно об’єднувати, оскільки вони вже були у вашій гілці). Якщо ви бажаєте ТІЛЬКИ змін, Eто git cherry-pick Eзамість цього вам слід .
neXus

Дякую хлопці за відповідь, я шукав те саме питання.
Акаш Бісарія

22

Спочатку витягніть останні коміти з віддаленого репо. Це не вплине на ваше місцеве відділення.

git fetch origin

Потім перевірте гілку віддаленого відстеження та створіть git-журнал, щоб побачити коміти

git checkout origin/master
git log

Візьміть хеш коміту коміту, до якого ви хочете об'єднати (або лише перші ~ 5 символів), і об'єднайте цей коміт у master

git checkout master
git merge <commit hash>

1
Я проголосував за вас, тому що це не працює, як рекламується. Перш за все, за допомогою вашого методу "git fetch origin" він отримує всі віддалені гілки (на це слід чітко вказати, особливо для людей, які працюють у проектах з великими та великими гілками). По-друге, за допомогою цього методу "git merge <коміт коміту>" не об'єднує вашу локальну історію з необхідним комітом, якщо ви повернулися в історію. Приклад: Ви знаходитесь локально на коміті 100, ви хочете отримати до 150, витягнувши все (з віддаленим HEAD на рівні 100).
заповнювач

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).
Запас Overwlaw

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 'Додавання листа'
[майстер 7f77979] Додавання листа
 1 файл змінено, 1 вставка (+)
$ echo 'e' >> буква; git add letter && git commit -m 'Додавання листа'
[master 790eade] Додавання листа
 1 файл змінено, 1 вставка (+)
$ git log
зафіксувати 790eade367b0d8ab8146596cd717c25fd895302a
Автор: Ден Фаррелл 
Дата: чт 16 липня 14:21:26 2015 -0500

    Додавання листа

зафіксувати 7f77979efd17f277b4be695c559c1383d2fc2f27
Автор: Ден Фаррелл 
Дата: чт 16 липня 14:21:24 2015 -0500

    Додавання листа

коміт f2458bea7780bf09fe643095dbae95cf97357ccc
Автор: Ден Фаррелл 
Дата: чт 16 липня 14:21:19 2015-0 500

    Додавання листа

зафіксувати 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Автор: Ден Фаррелл 
Дата: чт 16 липня 14:20:52 2015-0 500

    Додавання листа

здійснити 6e59e7650314112fb80097d7d3803c964b3656f0
Автор: Ден Фаррелл 
Дата: Чт, 16 липня 14:20:33 2015-500

    Початковий лист
$ git checkout 6e59e7650314112fb80097d7d3803c964b3656f
$ git checkout 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Примітка: перевірка '7126e6dcb9c28ac60cb86ae40fb358350d0c5fad'.

Ви перебуваєте у стані "від'єднана ГОЛОВА". Можна озирнутися, зробити експериментальний
зміни і вчинити їх, і ви можете відхилити будь-які зобов'язання, зроблені в цьому
штату, не впливаючи на жодні гілки, виконуючи чергову перевірку.

Якщо ви хочете створити нову гілку, щоб зберегти створені вами коміти, можете
зробіть це (зараз або пізніше), знову використовуючи -b із командою checkout. Приклад:

  git checkout -b new_branch_name

HEAD тепер на 7126e6d ... Додавання листа
$ git checkout -b B 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Переключено на нову гілку "B"
$ git pull 790eade367b0d8ab8146596cd717c25fd895302a
fatal: '790eade367b0d8ab8146596cd717c25fd895302a', схоже, не є сховищем git
fatal: Не вдалося прочитати з віддаленого сховища.

Переконайтесь, що у вас є правильні права доступу
і сховище існує.
$ git merge 7f77979efd17f277b4be695c559c1383d2fc2f27
Оновлення 7126e6d..7f77979
Швидко вперед
 лист | 2 ++
 1 файл змінено, 2 вставки (+)
$ котячий лист
a
b
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^`
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.