Будет ли выборка / слияние не работать, если файлы добавлены или удалены в репозитории GitHub?

Я сделал два изменения в моем remote repository в GitHub, добавив новый file и удаление old file (используя веб-интерфейс GitHub). когда я делаю:

git fetch origin master
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (5/5), done.
From github.com:TommyHilly/programFiles
 * branch            master     -> FETCH_HEAD
git merge origin/master
Already up-to-date.

всякий раз, когда новые файлы добавляются или удаляются, git pull только работает (git fetch/merge fails).

$git pull
From github.com:TommyHilly/programFiles
   b598c97..531d466  master     -> origin/master
Updating b598c97..531d466
Fast-forward
 README.txt |   2 ++
 a.out      | Bin 8496 -> 0 bytes
 2 files changed, 2 insertions(+)
 create mode 100644 README.txt
 delete mode 100755 a.out

Но когда я отредактировал некоторые файлы (ничего нового не было добавлено или удалено), git fetch а также merge работает отлично.

Я делаю что-то не так или это как git работает?

РЕДАКТИРОВАТЬ:

git remote -v
origin  git@github.com:TommyHilly/programFiles.git (fetch)
origin  git@github.com:TommyHilly/programFiles.git (push)

РЕДАКТИРОВАТЬ 2: просто делать git fetch а также git merge origin/master похоже на работу. Но я не понимаю, что происходит?

Но git fetch origin master с последующим git merge origin/master не работал?

1 ответ

Решение

Это правда, что git pull действительно просто git fetch плюс git merge, Но есть куча предостережений.

мерзкий выбор

Когда вы бежите:

$ git fetch origin master

это означает":

$ git fetch origin master:FETCH_HEAD

который говорит git fetch переехать к origin и спросите их - в данном случае github, и я буду использовать "они" и "они" здесь для обозначения origin, так что "это" означает "ваш выбор" - что они имеют для ответвления master, Что бы они ни имели, это приносит, но это ставит это под местное специальное название FETCH_HEAD,

Если вы запустите вместо:

$ git fetch origin

это "средство" для fetch переехать к origin и спросите их обо всех их ветвях и приведите их всех как "отдаленные ветви". Если у них есть ветки "master" и "эксперимент", он переносит их как "удаленные ветки" origin/master а также origin/experiment,

мерзавец слияния

Первый, git merge всегда сливается с вашей текущей веткой (помеченной * в git branch выход). 1 Другими словами, он знает, куда слить. Вы должны сказать ему, откуда слиться, хотя.

Если вы запускаете:

$ git merge

без аргументов, он должен выяснить, с какого коммит-идентификатора вы хотите "объединить". Это делается путем поиска переменной конфигурации, merge.defaultToUpstream, Если вы получаете:

fatal: No commit specified and merge.defaultToUpstream not set.

это означает merge.defaultToUpstream не установлен или установлен на false вместо true,

Если вы бежите git merge name-or-ID, что говорит git merge, что "слить", поэтому ему не нужна эта специальная переменная конфигурации. Следовательно:

$ git merge FETCH_HEAD

означает "найти коммит, указанный FETCH_HEAD ". Или, если вы запустите:

$ git merge origin/master

это означает "найти коммит, указанный origin/master ".

Важно: если вы предоставите более одного дополнительного аргумента git merge, это делает "слияние осьминога" (который я не собираюсь описывать в этом ответе). Это означает, что git merge origin master сильно отличается от git merge origin/master, Косая черта имеет огромное значение, потому что она меняет merge команда от слияния с двумя аргументами до слияния с одним аргументом. (Я думаю, что это неудачно - и / или плохой дизайн - что git pull Вы используете именно эти аргументы, но они имеют в виду нечто совсем иное git merge.)

Положить их вместе

Итак, когда вы хотите поставить FETCH_HEAD в git merge и когда вы хотите поставить origin/master вместо? Ну, вернитесь и перечитайте раздел о git fetch выше.

FETCH_HEAD метод старый 2 способ, которым вы говорите git fetch и место для выборки, и ветвь для выборки, и есть git fetch напишите результат под специальным именем FETCH_HEAD, Неважно, какую ветку вы выбрали: git fetch origin inigo_montoya, git fetch origin you_killed_my_father, git fetch origin inconceivable: они все приходят и переименовываются FETCH_HEAD так вот с чем вы сливаетесь.

origin/master метод новый 3 способа: вы бежите git fetch origin и это просто приносит все, и вы можете не торопиться и просматривать "удаленные ветви" на досуге. Как только вы довольны origin/master и готовы объединить его, вы объединяете его по его (ясному, простому и очевидному) имени, а не по FETCH_HEAD,

мерзавец

Увы, git pull, 4 pull Скрипт по-прежнему использует "старый способ". Когда ты бежишь git pull origin master или даже просто git pull без аргументов, 5 заводится git fetch origin master, что делает git fetch вести себя "по-старому". Тогда он использует git merge FETCH_HEAD, что он должен, потому что это просто запустить git fetch такой, что fetch не обновлялся origin/master, 6


1 Даже если вы находитесь в режиме "отсоединенная ГОЛОВА", git merge все еще сливается с вашей "текущей веткой", вроде. Просто самая близкая вещь к "текущей ветке" теперь это "отделенная ГОЛОВА".

2 Или, может быть, "традиционный". Я хотел бы, чтобы это было "устаревшим", и это могло бы произойти в конечном счете, но пока это довольно глубоко укоренилось.

3 И намного выше.:-)

4 мне не нравится git pull, Он предназначен для удобства, и из-за его настойчивости в выполнении "старого способа" он оказывается менее удобным, не говоря уже об одной редкой, но серьезной ошибке, которая была у него долгое время (исправлено в git 1.8.4).

5 Без аргументов git pull получает имя удаленного и ветви из конфигурации для текущей ветви. Если вы на ветке masterнапример, git читает branch.master.remote а также branch.master.merge получить origin а также master, Это те же самые значения, которые делают локальную ветвь master "отслеживающая ветвь", отслеживающая удаленная ветвь origin/master, Что здорово, кроме git pull сил git fetch не обновлять origin/master, Так git pull обновляет ваш местный master, но оставляет такие вещи, что мерзавец говорит вам, что вы сейчас впереди origin/master! Тьфу. (Это исправлено в git 1.8.4; git fetch обновляет удаленные ветви сейчас, даже когда пишет в FETCH_HEAD.)

6 Это исправлено в git 1.9, что в итоге может сделать git pull удобный метод, который на самом деле удобно.:-)

Другие вопросы по тегам