Git, Як скинути походження / master до комісії?


245

Я скидаю місцевого господаря до виконання цієї команди:

git reset --hard e3f1e37

коли я ввожу $ git statusкоманду, термінал каже:

# On branch master
# Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.

#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean

Оскільки я також хочу скинути походження / заголовок, я перевіряю на origin / master:

$ git checkout origin/master
Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 2aef1de... master problem fixed for master. its okay now.

і скиньте заголовок за допомогою цієї команди:

$ git reset --hard e3f1e37
HEAD is now at e3f1e37 development version code incremented for new build.

Тоді я спробував додати фіксацію до початку / заголовка, що я не мав успіху.

$ git commit -m "Reverting to the state of the project at e3f1e37"
# HEAD detached from origin/master
nothing to commit, working directory clean

Нарешті, я звертаюся до свого місцевого господаря.

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Оскільки я скидаю начальника походження / майстра, я думаю, що місцеві та походження повинні бути в тому ж напрямку, але, як ви бачите, git говорить, що мій місцевий / майстер відстає від походження / master на 7 комітів.

Як я можу виправити це питання? Те, що я шукаю, - голова місцевого / майстра та походження / майстра, вказує на той самий вчинок. Наступне зображення показує, що я зробив. Дякую.

введіть тут опис зображення


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

Відповіді:


563

origin/xxxгілки завжди вказують на віддалений. Ви не можете перевірити їх, оскільки вони не вказують на ваш локальний репозиторій (ви оформили лише фіксацію. Ось чому ви не побачите ім'я, записане в маркері гілки інтерфейсу командного рядка, лише хеш комітів).

Що потрібно зробити, щоб оновити пульт - змусити натиснути локальні зміни на головне:

git checkout master
git reset --hard e3f1e37
git push --force origin master
# Then to prove it (it won't print any diff)
git diff master..origin/master

9
це виконує запитувана операція, але майте на увазі, що це зробить нещасними тих людей, які вже витягли зобов’язання від майстра.
mnagel

Я дотримувався цього кроку, і він відкотився. Але походження / HEAD тепер вказує на іншу галузь, ніж на головну. Що я можу зробити, щоб це виправити?
Даніїл Шевельов

1
Вам не варто піклуватися про походження / голову, просто підштовхуйте хороший
відгук

Домовились, довелося це зробити сьогодні після випадкового об’єднання неправильних гілок разом, а потім підштовхування до походження. Це добре, але це може бути дуже руйнівним, якби інші люди перевіряли уражені гілки з походження. Використовуйте обережно.
Нік В.

1
Не працює. remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

52

Знайдене тут рішення допомогло нам оновити головну програму до попереднього комітету, який уже було натиснуто:

git checkout master
git reset --hard e3f1e37
git push --force origin e3f1e37:master

Ключова відмінність від прийнятої відповіді - хеш фіксації "e3f1e37:" перед майстром в команді push.


1
Не працює:remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

@ m0skit0 як повідомляється в повідомленні you should pull first:)
інтуїтивно зрозумілий

Відповідь на це є на сайті stackoverflow.com/a/10544328/1019307 - git config receive.denynonfastforwards falseале насправді я встановив це вручну у моєму локальному сховищі git, в /opt/gitякому я створив, щоб грати з ідеями тут. Я не впевнений, як чи якщо можна це зробити для bitbucket, github і т. Д. ... І @intuitivepixel, що безглуздо, оскільки це перевершує те, що ви намагалися досягти за допомогою жорсткого скидання.
HankCa

Привіт @jkovacs, я не хочу, щоб нові зміни в майстрі були видалені. Я просто хочу підштовхнути цей макет хеш "e3f1e37" до master master. Чи можливо, пропустивши скидання другої команди git --hard "e3f1e37"?
KarenAnne

Привіт @jkovacs, я щойно підтвердив, що можу пропустити 2-й крок. :)
KarenAnne

2

Якщо припустити, що ваша філія називається masterі тут, і віддалено, і що ви віддалене називається, originви можете зробити:

git reset --hard <commit-hash>
git push -f origin master

Однак вам слід уникати цього, якщо хтось інший працює з вашим віддаленим сховищем і вніс зміни. У такому випадку було б краще повернути зобов’язання, які ви не хочете, а потім натисніть як звичайно.


1

Оскільки у мене була подібна ситуація, я думав, що поділюсь своєю ситуацією і як ці відповіді мені допомогли (дякую всім).

Тож я вирішив працювати на місцевому рівні, змінюючи останнє зобов’язання кожного разу, коли я хотів зберегти свій прогрес на головній гілці (я знаю, я повинен був би розгалужуватися, домагатися цього, продовжувати натискання і пізніше об'єднатися назад до майстра).

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

Тому я не перевіряв майстра на місцях, тому що я вже був після вчинення. Майстер був незмінним. Мені навіть не потрібно було скидати - тверда, моя поточна фіксація була в порядку.

Я просто змусив натиснути на походження, навіть не уточнюючи, на який вчинок я хотів змусити примусити господаря, оскільки в цьому випадку це все, на що голова. Перевірено, git diff master..origin/masterщоб не було різниць, і все. Все виправлено. Дякую! (Я знаю, я новачок, який прожив, будь ласка, пробач!)

Тож якщо ви вже добре з місцевим відділенням, просто:

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