كيف يمكنني التحرك ارتباطات من الجذع إلى فرع في غيت؟

StackOverflow https://stackoverflow.com/questions/2376365

سؤال

لقد صنعت مجموعة من الالتزامات إلى السيد وأدركت بعد حقيقة أنه كان ينبغي أن يكونوا في فرع.

لقد نظرت إلى أشياء مختلفة عن إعادة صياغتها ودمجها وإعادة ضبطها. لكن لا توجد محاولات في التلاعب قد أسفرت عن تاريخ يبدو أنه ما أحاول القيام به.

محاولاتي تقودني إلى الاعتقاد بأنه يتطلب مزيجًا من مزيج من 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

لا يمكنك إعادة تسمية الفرع الذي تقوم به ، لذلك قمت بفحص فرع الأداء حيث قمت بنقل عمالي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top