كيف يمكنني التحرك ارتباطات من الجذع إلى فرع في غيت؟
-
24-09-2019 - |
سؤال
لقد صنعت مجموعة من الالتزامات إلى السيد وأدركت بعد حقيقة أنه كان ينبغي أن يكونوا في فرع.
لقد نظرت إلى أشياء مختلفة عن إعادة صياغتها ودمجها وإعادة ضبطها. لكن لا توجد محاولات في التلاعب قد أسفرت عن تاريخ يبدو أنه ما أحاول القيام به.
محاولاتي تقودني إلى الاعتقاد بأنه يتطلب مزيجًا من مزيج من rebase --onto
و reset --hard
لتحريك السيد مرة أخرى في الوقت المناسب. لكن فهمي لمتفرعة جيت يترك شيئًا مطلوبًا. جزء من القيام بذلك هو تعلم كيف يمكنني استخدامه.
تجدر الإشارة إلى أن أيا من التغييرات التي أحاول التحرك قد تم طردها.
تيار
* remote/trunk
--o--a--b--c--d--e--f <- master
|
o <- remote branch foo
النتيجة المرجوة
* remote/trunk
--o <- master
|
o--a--b--c--d--e--f <- remote branch foo
المحلول
لست متأكدًا من إعادة تسمية الفروع هو الحل الصحيح ، لأنه سيحصل عليك من:
* remote/trunk
--M--a--b--c--d--e--f <- master
|
F <- remote branch foo
إلى:
--F <- master
|
M--a--b--c--d--e--f <- remote branch foo
* remote/trunk
(شريطة إعادة تسمية remote/foo
, ، وهو أمر غير مستحسن: يجب عليك تتبعه أولاً ، ثم إعادة تسميته ، ولكن على الرغم من أن النتيجة النهائية تختلف عن ما تحتاجه)
وهي ليست "النتيجة المرجوة" التي تريدها (يحتاج فو إلى البدء من F ، وليس M):
* remote/trunk
--M <- master
|
F--a--b--c--d--e--f <- remote branch foo
يمكنك فقط تحقيق ذلك من خلال rebase --onto
git checkout --track -b origin/foo # create a local branch named after the remote one
git branch tmp # mark current foo HEAD to 'F'
git branch -f foo master # put foo where it should b: at 'f'
git branch -f master tmp^ # reset master to M, parent of tmp
git checkout tmp # go to where we must replay the commits
git rebase --onto tmp master foo # replay a to f on top of tmp
git svn dcommit # push the local foo in order to update remote/foo
يعطى لك:
* remote/trunk
--M <- master
|
F--a'--b'--c'--d'--e'--f' <- local foo and remote branch foo
نصائح أخرى
اختلاف في إجابة مارتن التي لن تنطبق بالضرورة على وضعك ، لكنني أريد نشره على أي حال :)
لنفترض أنك نسيت إنشاء الفرع في الالتزام o
, ، لذلك لديك:
x--y--z--o--a--b--c--d--e--f master
|
+
[forgot to make a branch here]
ثم أدركت أن ما تريده حقًا هو:
x--y--z--o master
|
+--a--b--c--d--e--f topic
ما يمكنك القيام به في هذه الحالة هو إنشاء فرع في o
باستخدام التجزئة:
git branch topic # creates new branch 'topic' - will be at commit `f`
git checkout o -b newmaster # creates new branch called newmaster pointing on commit `o` (please replace `o` with the actual hash)
git branch -M newmaster master # force rename newmaster to master (means master points on hash `o`)
ستكون في الفرع الرئيسي (الالتزام o
) ، لذا ، يمكنك كخطوة أخيرة يمكنك:
git checkout topic
بالطبع يمكن أن يكون التجزئة مجرد 5 أحرف ..
تعديل
لا ينبغي أن تهم كثيرًا أن تستخدمها git-svn
, ، ما يهم حقًا هو أنك لم تنشر فرعك الرئيسي في أي وقت بعد ذلك o
فرع في البوت ليس سوى مؤشر لالتزام. هذا هو السبب في أن المتفرعة رخيصة جدًا: يمكنك فقط إنشاء مؤشر ، ولديك فرع.
لا أعرف عن تتبع الفروع عن بُعد ، فقد تحتاج إلى إعداد ذلك بعد إعادة تسمية/تحريك فروعك.
يصحح ما يقترحه Hasen J تقريبًا ، لكن اضطررت إلى إجراء بعض التعديلات الصغيرة (وأنا أستخدم GIT-SVN):
# create the branch with your commits
git branch performance
# fork the master to a new branch at the commit before your local, non pushed commits
git branch newmaster 2d0516dfe8252de87
# checkout your branch
git checkout performance
# rename the newmaster
git branch -M newmaster master
# now checkout the master
git checkout master
لا يمكنك إعادة تسمية الفرع الذي تقوم به ، لذلك قمت بفحص فرع الأداء حيث قمت بنقل عمالي.