Sadece yanlış dal için iyi bir taahhütte bulundum. Ana şubemdeki son taahhüdü nasıl geri alabilirim ve sonra aynı değişiklikleri alıp yükseltme şubeme nasıl alabilirim?
Sadece yanlış dal için iyi bir taahhütte bulundum. Ana şubemdeki son taahhüdü nasıl geri alabilirim ve sonra aynı değişiklikleri alıp yükseltme şubeme nasıl alabilirim?
Yanıtlar:
Henüz değişikliklerinizi yapmadıysanız, yazılımdan sıfırlama da yapabilirsiniz:
git reset --soft HEAD^
Bu, taahhüdü geri alır, ancak taahhüt edilen değişiklikleri dizininize geri koyar. Şubelerin birbirine göre nispeten güncel olduğunu varsayarsak, diğer şubeye bir ödeme yapmanıza izin verir, bunun üzerine basitçe taahhüt edebilirsiniz:
git checkout branch
git commit
Dezavantajı, taahhüt mesajınızı tekrar girmeniz gerektiğidir.
git reset --soft HEAD\^
Konuya 4 yıl geç kaldı, ama bu birisi için yararlı olabilir.
Taahhüt etmeden önce yeni bir şube oluşturmayı unuttuysanız ve ne kadar taahhütte bulunursanız olun, master konusunda taahhütte bulunursanız, aşağıdaki yaklaşım daha kolaydır:
git stash # skip if all changes are committed
git branch my_feature
git reset --hard origin/master
git checkout my_feature
git stash pop # skip if all changes were committed
Artık ana dalınız eşittir origin/master
ve tüm yeni taahhütler açıktır my_feature
. my_feature
Uzak bir şube değil, yerel bir şube olduğunu unutmayın .
master
sonra sıfırlama master
için origin/master
.
origin/master
zaten sıfırlamak istediğiniz taahhütte! Bahşiş için kredi bu sayfada: github.com/blog/…
Bir taahhüdü geri almak için (bir sonraki adım için taahhüdün karmasını not ettiğinizden emin olun):
git reset --hard HEAD^
Bu taahhüdü farklı bir şubeye çekmek için:
git checkout other-branch
git cherry-pick COMMIT-HASH
Ayrıca dikkat git reset --hard
edecek herhangi izlenmeyen ve modifiye değişiklikleri öldürmek o varsa yüzden tercih olabilir, aşağıdakiler bulunabilir:
git reset HEAD^
git checkout .
git rev-parse BRANCH_NAME
Sha almak için.
git reflog show <branch>
!
git stash
, sıfırlamadan önce bir kişi olabilir ve git stash pop
bunları geri yüklemek için daha sonra kullanabilirsiniz , bu yüzden --hard
parçadan korkmanıza gerek yoktur
Değişikliklerinizi zaten ittiyseniz, HEAD'i sıfırladıktan sonra bir sonraki pushunuzu zorlamanız gerekir.
git reset --hard HEAD^
git merge COMMIT_SHA1
git push --force
Uyarı: Donanımdan sıfırlama, çalışma kopyanızdaki taahhüt edilmemiş değişiklikleri geri alırken, zorla itme, uzak dalın durumunun yerel dalın geçerli durumu ile tamamen üzerine yazılmasına neden olur.
Her ihtimale karşı, Windows'ta (Bash ^^^^
yerine Windows komut satırını kullanarak) aslında bir yerine dörttür , bu yüzden
git reset --hard HEAD^^^^
git reset --hard COMMIT_HASH
git push --force
Geçenlerde aynı şeyi yaptım, burada başka bir şubeye bağlı kalmam gerektiğinde yanlışlıkla ustalaşmak için bir değişiklik yaptım. Ama hiçbir şey itmedim.
Sadece yanlış şubeyi taahhüt ettiyseniz ve o zamandan beri bir şey değiştirmediyseniz ve repoya itmediyseniz, aşağıdakileri yapabilirsiniz:
// rewind master to point to the commit just before your most recent commit.
// this takes all changes in your most recent commit, and turns them into unstaged changes.
git reset HEAD~1
// temporarily save your unstaged changes as a commit that's not attached to any branch using git stash
// all temporary commits created with git stash are put into a stack of temporary commits.
git stash
// create other-branch (if the other branch doesn't already exist)
git branch other-branch
// checkout the other branch you should have committed to.
git checkout other-branch
// take the temporary commit you created, and apply all of those changes to the new branch.
//This also deletes the temporary commit from the stack of temp commits.
git stash pop
// add the changes you want with git add...
// re-commit your changes onto other-branch
git commit -m "some message..."
NOT: yukarıdaki örnekte, git reset HEAD ~ 1 ile 1 kaydedmeyi geri sarıyordum. Ancak n işlemeyi geri sarmak istiyorsanız git reset HEAD ~ n yapabilirsiniz.
Ayrıca, yanlış şubeyi taahhüt ettiyseniz ve yanlış şubeyi taahhüt ettiğinizi fark etmeden önce biraz daha kod yazdıysanız, devam eden çalışmanızı kaydetmek için git stash'ı kullanabilirsiniz:
// save the not-ready-to-commit work you're in the middle of
git stash
// rewind n commits
git reset HEAD~n
// stash the committed changes as a single temp commit onto the stack.
git stash
// create other-branch (if it doesn't already exist)
git branch other-branch
// checkout the other branch you should have committed to.
git checkout other-branch
// apply all the committed changes to the new branch
git stash pop
// add the changes you want with git add...
// re-commit your changes onto the new branch as a single commit.
git commit -m "some message..."
// pop the changes you were in the middle of and continue coding
git stash pop
NOT: Bu web sitesini referans olarak kullandım https://www.clearvision-cm.com/blog/what-to-do-when-you-commit-to-the-wrong-git-branch/
git checkout -b new_branch
oradan bir hak yaptım , taahhütler sağlamdı, sadece itti ve bir PR yarattı, yapmadı ' Tekrar taahhüt etmek zorunda değilim.
Dolayısıyla, senaryonuz taahhüt ettiyseniz master
ancak taahhüt etmeyi amaçladıysanız another-branch
(zaten var olabilir veya olmayabilir), ancak henüz itmediyseniz, bunu düzeltmek oldukça kolaydır.
// if your branch doesn't exist, then add the -b argument
git checkout -b another-branch
git branch --force master origin/master
Şimdi tüm taahhütleriniz devam master
edecek another-branch
.
Sevgiden kaynak: http://haacked.com/archive/2015/06/29/git-migrate/
another-branch
zaten vardı. Bu durumda, ustalaşmak için yaptığım taahhütleri nuked etti ve koymadım another-branch
.
Üzerinde durmak için bu size gelen örn taşımak için birden hareketin sahip durumda, cevap develop
için new_branch
:
git checkout develop # You're probably there already
git reflog # Find LAST_GOOD, FIRST_NEW, LAST_NEW hashes
git checkout new_branch
git cherry-pick FIRST_NEW^..LAST_NEW # ^.. includes FIRST_NEW
git reflog # Confirm that your commits are safely home in their new branch!
git checkout develop
git reset --hard LAST_GOOD # develop is now back where it started
Sizin için, sadece 1 taahhüt varsa, o zaman başka birçok kolay sıfırlama çözümü var. Benim için, yanlışlıkla master
diyelim, yanlışlıkla diyelim yaklaşık 10 taahhüdüm vardı branch_xyz
ve taahhüt geçmişini kaybetmek istemedim.
Yapabilecekleriniz ve beni kurtaran şey, bu yanıtı referans olarak, 4 adımlı bir işlem kullanarak kullanmaktı.
master
branch_xyz
master
Aşağıda ayrıntılı olarak açıklanan adımlar verilmiştir -
master
(Yanlışlıkla çok fazla değişiklik yaptığım yerden) yeni bir şube oluştur
git checkout -b temp_branch_xyz
Not: -b
flag yeni bir şube oluşturmak için kullanılır
Sadece bu hakkımız olup olmadığını doğrulamak git branch
için, temp_branch_xyz
şubede olduğumuzdan emin olmak için hızlı bir şekilde yapacağım git log
ve taahhütlerin doğru olup olmadığını kontrol etmek için bir a yapacağım.
Geçici dalı, taahhütler için başlangıçta amaçlanan şubeye birleştirin, yani branch_xyz
.
İlk olarak, orijinal şubeye geçin, örneğin branch_xyz
( Yapmadıysanız yapmanız gerekebilir git fetch
)
git checkout branch_xyz
Not: -b
Bayrağı kullanmıyor
Şimdi, geçici şubeyi şu anda ödeme yaptığımız şubeye birleştirelimbranch_xyz
git merge temp_branch_xyz
Varsa, burada bazı çatışmalara dikkat etmeniz gerekebilir. Başarılı bir şekilde birleştirdikten sonra sonraki adımlara geçebilir veya devam ettirebilirsiniz.
Yanlışlıkla bu yanıtı referans olarak master
kullanma taahhüdünü geri alın , öncemaster
git checkout master
sonra uzaktan kumandayla eşleştirmek için geri alın (veya isterseniz belirli bir işleme)
git reset --hard origin/master
Yine, git log
amaçlanan değişikliklerin etkili olduğundan emin olmak için önce ve sonra yapacağım.
Kanıt silindiğinde, bu geçici şubenin silinmesidir. Bunun için öncelikle geçici yani birleştirilecek olduğu şube ödeme gerekir branch_xyz
(eğer kalırsan master
ve komut aşağıda yürütmek, bir alabilirsiniz error: The branch 'temp_branch_xyz' is not fully merged
), bu yüzden yapalım
git checkout branch_xyz
ve sonra bu yanlış anlamanın kanıtını silin
git branch -d temp_branch_xyz
İşte böyle.
Değişikliklerinizi uygulamak istediğiniz şube zaten mevcutsa ( örneğin şube geliştirme ), aşağıdaki fotanus tarafından sağlanan talimatları izleyin , ardından:
git checkout develop
git rebase develop my_feature # applies changes to correct branch
git checkout develop # 'cuz rebasing will leave you on my_feature
git merge develop my_feature # will be a fast-forward
git branch -d my_feature
Ve açıkçası kullanabilirsiniz tempbranch yerine veya başka bir şube adını my_feature isterseniz.
Ayrıca, uygunsa, hedef dalınızda birleştirilene kadar saklı pop'u (uygula) geciktirin.
Benim için bu, ittiğim taahhüdü tersine çevirip, daha sonra bu şubeyi diğer şubeye çekerek çözüldü.
git checkout branch_that_had_the_commit_originally
git revert COMMIT-HASH
git checkout branch_that_was_supposed_to_have_the_commit
git cherry pick COMMIT-HASH
git log
Doğru karmayı bulmak için kullanabilirsiniz ve bu değişiklikleri istediğiniz zaman itebilirsiniz!