Git Pull неможливо, незлиті файли


89

Я прочитав усі подібні запитання щодо цього; здається, що нічого з наведеного не спрацювало:

Delete offending files
git reset --hard HEAD
git stash
git pull

Майже кожна комбінація, приховуючи зміни та витягуючи зі сховища, призводить до незнімних файлів. Я хотів би відкинути всі локальні зміни і просто скористатися пультом дистанційного керування, але я не можу знову клонувати (обмеження пропускної здатності та використання Інтернету, коли розробник намагається це зробити). Як це зробити?

Щойно спробував:

git stash
git pull

Також не працював.

Більше інформації

Існує один локальний коміт, і вгору по течії є коміт. Таким чином я спробував, git pull --rebaseале він все ще не працює належним чином ... Це призводить до помилок - "вихід із-за невирішеного конфлікту". Якщо я це роблю git stash, git reset --hard HEAD, git pull --rebase, з’являється повідомлення про помилку "тягнути не можна, незлиті зміни ..."

Відповіді:


199

Скажімо, пульт є originі гілка є master, і скажіть, що ви вже masterзареєструвались, можливо, спробуйте наступне:

git fetch origin
git reset --hard origin/master

Це в основному просто бере поточну гілку і вказує HEADна віддалену гілку.

ПОПЕРЕДЖЕННЯ : Як зазначено в коментарях, це призведе до видалення ваших локальних змін та перезапису того, що є у джерелі .

Або ви можете використовувати сантехнічні команди, щоб зробити по суті те саме:

git fetch <remote>
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>)
git reset --hard

EDIT: Я хотів би коротко пояснити, чому це працює.

.gitПапка може містити здійснювало для будь-якої кількості сховищ. Оскільки хеш коміту насправді є методом перевірки вмісту коміту, а не просто випадковим чином згенерованим значенням, він використовується для узгодження наборів комітів між репозиторіями.

Гілка - це просто іменований вказівник на заданий хеш. Ось приклад набору:

$ find .git/refs -type f
.git/refs/tags/v3.8
.git/refs/heads/master
.git/refs/remotes/origin/HEAD
.git/refs/remotes/origin/master

Кожен із цих файлів містить хеш, що вказує на коміт:

$ cat .git/refs/remotes/origin/master
d895cb1af15c04c522a25c79cc429076987c089b

Це все для внутрішнього механізму зберігання git і працює незалежно від робочого каталогу . Виконуючи такі дії:

git reset --hard origin/master

git вкаже поточну гілку на те саме хеш-значення, на яке вказує origin / master. Потім він примусово змінює робочий каталог відповідно до структури файлу / вмісту в цьому хеші.

Щоб побачити це на роботі, спробуйте наступне:

git checkout -b test-branch
# see current commit and diff by the following
git show HEAD
# now point to another location
git reset --hard <remote>/<branch>
# see the changes again
git show HEAD

2
З нещодавнього затвердженого редагування, додавши на початку масове попередження, просто хотілося б зазначити, що воно вже згадувалося: "Тоді [git] насильно змінює робочий каталог відповідно до структури файлу / вмісту в цьому хеші." Але припустимо, цього було недостатньо чітко.
Тревор Норріс,


5

Вирішено за допомогою наступного набору команд:

git reset --hard
git pull --rebase
git rebase --skip
git pull

Фокус полягає в перебазуванні змін ... У нас були проблеми з перебазуванням одного тривіального коміту, і тому ми просто пропустили його за допомогою git rebase --skip (після копіювання файлів).


3

Якщо ви коли-небудь отримаєте цю проблему після запуску, git fetchа потім git не дозволяє вам запускати git pullчерез конфлікт злиття ( як модифіковані / незлиті файли , так і зробити вас більш розчарованими, це не покаже вам жодних маркерів конфлікту в файл, оскільки він ще не об'єднаний). Якщо ви не хочете втратити свою роботу, ви можете зробити наступне.

індексувати файл.

$ git add filename

потім сховати локальні зміни.

$ git stash

витягніть та оновіть свій робочий каталог

$ git pull

відновити локальний змінений файл (git автоматично об’єднається, якщо зможе, інакше вирішить)

$ git stash pop

Сподіваюся, це допоможе.


2

Є рішення, навіть якщо ви не хочете видаляти свої локальні зміни. Просто виправте незлиті файли (за допомогою git addабо git remove). Тоді зробіть git pull.


1

Якщо припустити, що ви хочете відкинути будь-які зміни, спочатку перевірте результати git status. Для будь-якого файлу, на якому поруч із написом "unmerged", запустіть git add <unmerged file>. Потім продовжуйте git reset --hard. Це дозволить позбутися будь-яких локальних змін, крім невідстежених файлів.


Авжеж. У ньому не може бути сказано "незлитий". Тут також можна сказати "обидва модифіковані" або, можливо, одна чи дві інші речі. Який результат git status?
Ryan Stewart

Опублікувавши це, я кажу члену команди спробувати, git rebase --abortі git pull --rebaseзгідно з пропозицією git
Крістіан Стюарт

1

Я вирішив за допомогою git видалити незлитий файл локально.

$ git rm <the unmerged file name>
$ git reset --hard
$ git pull --rebase
$ git rebase --skip
$ git pull
Already up-to-date.

Коли я відправляю git commit потім:

$ git commit . -m "my send commit"
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

0

Відповідь Райана Стюарта майже була. У випадку, коли ви насправді не хочете видаляти свої локальні зміни, є робочий процес, який ви можете використовувати для об’єднання:

  • Біжи git status. Він надасть вам список незлитих файлів.
  • Об’єднайте їх (вручну тощо)
  • Біжи git commit

Git здійснить лише злиття в новий коміт. (У моєму випадку на диску я додав додаткові файли, які не були включені в цей коміт.)

Потім Git вважає злиття успішним і дозволяє рухатися вперед.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.