it-swarm.asia

كيف يمكنني التراجع 1 الالتزام؟

لدي 2 إلتزاما بأنني لم أدفع:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

كيف يمكنني استعادة أول واحد (الأقدم) ، لكن مع الاحتفاظ بالثاني؟

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

من هنا:

http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

هل أنا فقط بحاجة إلى القيام به:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

هذا هو؟

125
n179911

الطريقة الأكثر أمانًا وربما أنظف في ذلك هي إعادة تفاعلي.

git rebase -i HEAD^^

أو،

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

من هناك ، يمكنك تنفيذ عمليات الإسكواش ، والتي تجمع واحدة أو أكثر من الإلتزامات معًا في الالتزام السابق. لحذف التزام من السجل بالكامل ، احذف السطر من القائمة.

يمكنك التراجع عن الالتزام برمز git revert ولكن سيؤدي ذلك إلى إضافة المزيد من رسائل الالتزام إلى السجل ، والتي قد تكون غير مرغوب فيها. استخدم المعلمة -n لإخبار Git بعدم الالتزام بالعودة على الفور. يمكنك إعادة الدوران بشكل تفاعلي والسحق على ما يصل إلى سابق تعهد للحفاظ على الأمور نظيفة.

إذا كان الالتزامان اللذان تعملان بهما هنا يؤثران على نفس الملف (الملفات) ، فقد ترى تعارضًا في الدمج.

يجب أن تتم إعادة تعيين المخزون باستخدام git reset --hard بعناية ، حيث لا يمكن التراجع عنه.

يجب أن يتم إعادة كتابة التاريخ بعناية.

94
jtimberman

هذا إذا كان من http://nakkaya.com/2009/09/24/git-delete-last-commit/ وقد عملت لي

بوابة حذف الالتزام الأخير

مرة واحدة في وقت متأخر من الليل عندما نفدت القهوة ، أرتكب أشياء لا ينبغي أن أتناولها. ثم أقضي ما بين 10 إلى 15 دقيقة في googling كيفية إزالة آخر التزام قمت به. لذلك بعد المرة الثالثة أردت أن أسجل سجلاً حتى أتمكن من الرجوع إليه لاحقًا.

إذا كنت قد ارتكبت خردة ولكن لم تدفع ،

git reset --hard HEAD~1

HEAD ~ 1 هو اختصار للالتزام قبل الرأس. بدلاً من ذلك ، يمكنك الرجوع إلى SHA-1 للتجزئة التي تريد إعادة التعيين إليها. لاحظ أنه عند استخدام - قم بإجراء أي تغييرات على الملفات المتعقبة في شجرة العمل منذ فقد الالتزام قبل الرأس.

إذا كنت لا ترغب في مسح العمل الذي قمت به ، فيمكنك استخدام خيار --soft الذي سيؤدي إلى حذف الالتزام ، لكنه سيترك جميع ملفاتك التي تم تغييرها "تغييرات يجب الالتزام بها" ، حيث ستضعها حالة git.

الآن إذا كنت قد دفعت بالفعل وسحب شخص ما عادة ما يكون حالتي ، لا يمكنك استخدام إعادة تعيين بوابة. ومع ذلك يمكنك القيام بعودة بوابة ،

git revert HEAD

سيؤدي هذا إلى إنشاء التزام جديد يعكس كل شيء تم تقديمه بواسطة الالتزام العرضي.

51
iStryker

كلا. git-reset - hard سيعودك في التاريخ. ما كنت تبحث عنه هو العودة بوابة ، والتي سوف التراجع عن أي التزام.

8
Peltier

أنا فقط فعلت هذا:

git rebase -i HEAD^^

أنا ثمل ذلك حتى فعلت

git rebase --abort

ثم فعلت ذلك مرة أخرى. ثم اضطررت لدفع مثل هذا:

git Push Origin master -f

ودمرت ارتكاب أحدث من الالتزام الذي التراجع عنه. عملت كبيرة.

5
hamstar

في إشارة إلى تعليق jtimberman حول git reset --hard يجري التراجع ، هذا ليس صحيحًا تمامًا. انظر هنا: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1

4
mattd

لا ، git reset --hard baf8d5e سيحذف الالتزام 3368e1c و HEAD سيكون في baf8d5e بعد ذلك.

إذا كنت ترغب في الحفاظ على الالتزام 3368e1c وحذفه bad8d5e ، فإن أسهل حل هو تنفيذ "git rebase -i HEAD~2" (أي rebase تفاعلي لآخر إثنين من الأوامر). سيؤدي هذا الأمر إلى تشغيل محرر رسالة الالتزام الخاص بك وسترى سطرًا واحدًا لكل من آخر إثنين من الأوامر. هناك يمكنك فقط حذف سطر الالتزام bad8d5e وحفظه. سوف git ثم إعادة كتابة التاريخ الخاص بك وسيتم الالتزام الثاني.

هناك أوامر أخرى مفيدة يمكنك استخدامها في محرر رسائل الالتزام مثل squash ، edit ، وما إلى ذلك. rebase التفاعلي قوي جدًا!

لا تفعل هذا إذا رأى شخص ما بالفعل هذه الإلتزامات (ادفع أو اسحب من مستودعك)!

4
knweiss
git reset --hard {ref}

هي الطريقة الوحيدة للتراجع عن التزام إذا كان هناك التزام واحد آخر في الريبو (على سبيل المثال ، التزام أولي وواحد آخر). ما تبقى من الطرق (العودة ، rebase) ترفض العمل ، على الأقل اعتبارا من بوابة 1.7.5.1.

إذا اتبعت git reset برمز git gc ، فستحذف git بالفعل بيانات الالتزام القديمة من الريبو تمامًا.

1
squeegee
git checkout <treeish> -- /path/to/dir

سيؤدي ذلك إلى إعادة الدليل من "treeish" المعطى لـ/path/إلى/dir

1
lokeshpahal

لقد نجحت في ذلك من خلال تحرير رموز التجزئة الخاصة بآخر أوامر من HEAD الملفات داخل مجلد المخزون يدويًا:

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

قبل ذلك ، لم أتمكن مطلقًا من الدفع إلى الأصل لعمليات UNMERGE التي قمت بها محليًا. ظل يقول أنه "فشل في دفع بعض الحكام" إلى المستودع المركزي.

0
Leandro M