Tôi chỉ thực hiện một cam kết hoàn toàn tốt cho chi nhánh sai. Làm cách nào để hoàn tác cam kết cuối cùng trong nhánh chính của mình và sau đó thực hiện các thay đổi tương tự và đưa chúng vào nhánh nâng cấp của tôi?
Tôi chỉ thực hiện một cam kết hoàn toàn tốt cho chi nhánh sai. Làm cách nào để hoàn tác cam kết cuối cùng trong nhánh chính của mình và sau đó thực hiện các thay đổi tương tự và đưa chúng vào nhánh nâng cấp của tôi?
Câu trả lời:
Nếu bạn chưa đẩy các thay đổi của mình, bạn cũng có thể thực hiện đặt lại mềm:
git reset --soft HEAD^
Điều này sẽ hoàn nguyên cam kết, nhưng đưa các thay đổi đã cam kết trở lại vào chỉ mục của bạn. Giả sử các chi nhánh tương đối cập nhật với nhau, git sẽ cho phép bạn thực hiện kiểm tra vào chi nhánh khác, trong đó bạn có thể chỉ cần cam kết:
git checkout branch
git commit
Nhược điểm là bạn cần nhập lại tin nhắn cam kết của mình.
git reset --soft HEAD\^
4 năm muộn về chủ đề này, nhưng điều này có thể hữu ích cho ai đó.
Nếu bạn quên tạo một chi nhánh mới trước khi cam kết và cam kết tất cả với chủ, bất kể bạn đã thực hiện bao nhiêu lần cam kết, cách tiếp cận sau đây dễ dàng hơn:
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
Bây giờ bạn có nhánh chủ của bạn bằng origin/master
và tất cả các cam kết mới được bật my_feature
. Lưu ý rằng đó my_feature
là một chi nhánh địa phương, không phải là một chi nhánh từ xa.
master
, sau đó thiết lập lại master
để origin/master
.
origin/master
đã có trên cam kết bạn muốn đặt lại tại! Tuy nhiên, khoản tín dụng cho tiền boa là trang này: github.com/blog/ từ
Để khôi phục một cam kết (đảm bảo bạn lưu ý hàm băm của cam kết cho bước tiếp theo):
git reset --hard HEAD^
Để kéo cam kết đó vào một nhánh khác:
git checkout other-branch
git cherry-pick COMMIT-HASH
Cũng lưu ý rằng git reset --hard
sẽ giết mọi thay đổi chưa được theo dõi và sửa đổi mà bạn có thể có, vì vậy nếu bạn có những thay đổi bạn có thể thích:
git reset HEAD^
git checkout .
git rev-parse BRANCH_NAME
để có được sha.
git reflog show <branch>
!
git stash
trước khi thiết lập lại và sử dụng git stash pop
sau đó để khôi phục chúng, vì vậy không cần phải lo sợ về --hard
phần này
Nếu bạn đã đẩy các thay đổi của mình, bạn sẽ cần phải thực hiện lần đẩy tiếp theo sau khi đặt lại ĐẦU.
git reset --hard HEAD^
git merge COMMIT_SHA1
git push --force
Cảnh báo: thiết lập lại cứng sẽ hoàn tác mọi sửa đổi không được cam kết trong bản sao làm việc của bạn, trong khi lực đẩy sẽ ghi đè hoàn toàn trạng thái của nhánh từ xa với trạng thái hiện tại của nhánh cục bộ.
Chỉ trong trường hợp, trên Windows (sử dụng dòng lệnh Windows, không phải Bash), thực tế là bốn ^^^^
thay vì một, vì vậy nó
git reset --hard HEAD^^^^
git reset --hard COMMIT_HASH
git push --force
Gần đây tôi đã làm điều tương tự, nơi tôi vô tình cam kết thay đổi thành chủ, khi tôi đáng lẽ phải cam kết với chi nhánh khác. Nhưng tôi đã không thúc ép bất cứ điều gì.
Nếu bạn vừa cam kết với chi nhánh sai và không thay đổi bất cứ điều gì kể từ đó và không bị đẩy sang repo, thì bạn có thể làm như sau:
// 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..."
LƯU Ý: trong ví dụ trên, tôi đã tua lại 1 lần xác nhận với git reset HEAD ~ 1. Nhưng nếu bạn muốn tua lại n cam kết, thì bạn có thể thực hiện git reset HEAD ~ n.
Ngoài ra, nếu bạn đã kết thúc sai chi nhánh và cuối cùng cũng viết thêm một số mã trước khi nhận ra rằng bạn đã cam kết với chi nhánh sai, thì bạn có thể sử dụng git stash để lưu công việc đang thực hiện của mình:
// 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
LƯU Ý: Tôi đã sử dụng trang web này làm tài liệu tham khảo https://www.clearvision-cm.com/blog/what-to-do-when-you-commit-to-the-wrong-git-branch/
git checkout -b new_branch
quyền từ đó, cam kết vẫn nguyên vẹn, chỉ cần thúc đẩy và tạo ra một PR, đã không ' t phải cam kết lại.
Vì vậy, nếu kịch bản của bạn là bạn đã cam kết master
nhưng có nghĩa là cam kết another-branch
(có thể có hoặc không tồn tại) nhưng bạn vẫn chưa thúc đẩy, thì điều này khá dễ khắc phục.
// if your branch doesn't exist, then add the -b argument
git checkout -b another-branch
git branch --force master origin/master
Bây giờ tất cả các cam kết của bạn master
sẽ được trên another-branch
.
Được nuôi dưỡng bằng tình yêu từ: http://haacked.com/archive/2015/06/29/git-migrate/
another-branch
đã tồn tại Trong trường hợp này, nó chỉ thu được các cam kết mà tôi đã thực hiện và không đưa chúng vào another-branch
.
Để xây dựng trên này câu trả lời, trong trường hợp bạn có nhiều cam kết để di chuyển từ, ví dụ như develop
để 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
Nếu đối với bạn, đó chỉ là khoảng 1 cam kết, thì có rất nhiều giải pháp đặt lại dễ dàng khác có sẵn. Đối với tôi, tôi đã có khoảng 10 lần cam kết được thực hiện master
thay vì, hãy gọi nó branch_xyz
và tôi không muốn mất lịch sử cam kết.
Những gì bạn có thể làm và những gì đã cứu tôi đã sử dụng câu trả lời này làm tài liệu tham khảo, sử dụng quy trình 4 bước, đó là -
master
branch_xyz
master
Dưới đây là các bước trên chi tiết -
Tạo một chi nhánh mới từ master
(nơi tôi đã vô tình thực hiện rất nhiều thay đổi)
git checkout -b temp_branch_xyz
Lưu ý: -b
cờ được sử dụng để tạo chi nhánh mới
Chỉ để xác minh xem chúng tôi có đúng không, tôi sẽ làm nhanh git branch
để đảm bảo rằng chúng tôi đang ở trong temp_branch_xyz
chi nhánh và git log
kiểm tra xem chúng tôi có xác nhận đúng không.
Hợp nhất nhánh tạm thời vào nhánh ban đầu dự định cho các xác nhận, nghĩa là branch_xyz
.
Đầu tiên, chuyển sang nhánh ban đầu tức là branch_xyz
(Bạn có thể cần git fetch
nếu bạn không có)
git checkout branch_xyz
Lưu ý: Không sử dụng -b
cờ
Bây giờ, hãy hợp nhất nhánh tạm thời vào nhánh chúng tôi hiện đang thanh toánbranch_xyz
git merge temp_branch_xyz
Bạn có thể phải quan tâm đến một số xung đột ở đây, nếu có. Bạn có thể đẩy (tôi sẽ) hoặc chuyển sang các bước tiếp theo, sau khi hợp nhất thành công.
Hoàn tác các cam kết vô tình về master
việc sử dụng câu trả lời này làm tài liệu tham khảo, trước tiên hãy chuyển sangmaster
git checkout master
sau đó hoàn tác lại để khớp với điều khiển từ xa (hoặc với cam kết cụ thể, nếu bạn muốn)
git reset --hard origin/master
Một lần nữa, tôi sẽ làm git log
trước và sau chỉ để đảm bảo rằng những thay đổi dự định có hiệu lực.
Xóa bằng chứng, đó là xóa chi nhánh tạm thời. Đối với điều này, trước tiên bạn cần kiểm tra nhánh mà temp đã được hợp nhất vào, tức là branch_xyz
(Nếu bạn tiếp tục master
và thực hiện lệnh bên dưới, bạn có thể nhận được a error: The branch 'temp_branch_xyz' is not fully merged
), vì vậy hãy
git checkout branch_xyz
và sau đó xóa bằng chứng về sự rủi ro này
git branch -d temp_branch_xyz
Có bạn đi.
Nếu chi nhánh bạn muốn áp dụng các thay đổi của mình đã tồn tại ( ví dụ: phát triển chi nhánh ), hãy làm theo các hướng dẫn được cung cấp bởi fotanus bên dưới, sau đó:
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
Và rõ ràng bạn có thể sử dụng tempbranch hoặc bất kỳ tên chi nhánh nào khác thay vì my_feature nếu bạn muốn.
Ngoài ra, nếu có thể, hãy trì hoãn stash pop (áp dụng) cho đến khi bạn sáp nhập tại chi nhánh mục tiêu của mình.
Đối với tôi, điều này đã được giải quyết bằng cách hoàn nguyên cam kết mà tôi đã đẩy, sau đó chọn anh đào cam kết với chi nhánh khác.
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
Bạn có thể sử dụng git log
để tìm băm chính xác và bạn có thể đẩy những thay đổi này bất cứ khi nào bạn muốn!