Sử dụng git rebase --interactive
để chỉnh sửa cam kết trước đó, chạy git reset HEAD~
và sau đó git add -p
để thêm một số, sau đó thực hiện một cam kết, sau đó thêm một số và thực hiện một cam kết khác, bao nhiêu lần tùy thích. Khi bạn hoàn thành, hãy chạy git rebase --continue
và bạn sẽ có tất cả các cam kết phân chia trước đó trong ngăn xếp của bạn.
Quan trọng : Lưu ý rằng bạn có thể chơi xung quanh và thực hiện tất cả các thay đổi bạn muốn và không phải lo lắng về việc mất các thay đổi cũ, bởi vì bạn luôn có thể chạy git reflog
để tìm điểm trong dự án có chứa các thay đổi bạn muốn, (hãy gọi nó là a8c4ab
) , và sau đó git reset a8c4ab
.
Dưới đây là một loạt các lệnh để hiển thị cách thức hoạt động của nó:
mkdir git-test; cd git-test; git init
bây giờ thêm một tập tin A
vi A
thêm dòng này:
one
git commit -am one
sau đó thêm dòng này vào A:
two
git commit -am two
sau đó thêm dòng này vào A:
three
git commit -am three
bây giờ tập tin A trông như thế này:
one
two
three
và chúng tôi git log
trông giống như sau (tốt, tôi sử dụnggit log --pretty=oneline --pretty="%h %cn %cr ---- %s"
bfb8e46 Rose Perrone 4 seconds ago ---- three
2b613bc Rose Perrone 14 seconds ago ---- two
9aac58f Rose Perrone 24 seconds ago ---- one
Hãy nói rằng chúng tôi muốn phân chia cam kết thứ hai , two
.
git rebase --interactive HEAD~2
Điều này mang đến một thông điệp trông như thế này:
pick 2b613bc two
pick bfb8e46 three
Thay đổi đầu tiên pick
thành một e
để chỉnh sửa cam kết đó.
git reset HEAD~
git diff
cho chúng ta thấy rằng chúng ta chỉ chưa thực hiện cam kết mà chúng ta đã thực hiện cho lần xác nhận thứ hai:
diff --git a/A b/A
index 5626abf..814f4a4 100644
--- a/A
+++ b/A
@@ -1 +1,2 @@
one
+two
Hãy để giai đoạn thay đổi và thêm "và một phần ba" vào dòng đó trong tệp A
.
git add .
Đây thường là điểm trong một cuộc nổi loạn tương tác nơi chúng tôi sẽ chạy git rebase --continue
, bởi vì chúng tôi thường chỉ muốn quay lại trong đống cam kết của mình để chỉnh sửa một cam kết trước đó. Nhưng lần này, chúng tôi muốn tạo một cam kết mới. Vì vậy, chúng tôi sẽ chạy git commit -am 'two and a third'
. Bây giờ chúng tôi chỉnh sửa tập tin A
và thêm dòng two and two thirds
.
git add .
git commit -am 'two and two thirds'
git rebase --continue
Chúng tôi có mâu thuẫn với cam kết của mình three
, vì vậy hãy giải quyết nó:
Chúng tôi sẽ thay đổi
one
<<<<<<< HEAD
two and a third
two and two thirds
=======
two
three
>>>>>>> bfb8e46... three
đến
one
two and a third
two and two thirds
three
git add .; git rebase --continue
Bây giờ chúng ta git log -p
trông như thế này:
commit e59ca35bae8360439823d66d459238779e5b4892
Author: Rose Perrone <roseperrone@fake.com>
Date: Sun Jul 7 13:57:00 2013 -0700
three
diff --git a/A b/A
index 5aef867..dd8fb63 100644
--- a/A
+++ b/A
@@ -1,3 +1,4 @@
one
two and a third
two and two thirds
+three
commit 4a283ba9bf83ef664541b467acdd0bb4d770ab8e
Author: Rose Perrone <roseperrone@fake.com>
Date: Sun Jul 7 14:07:07 2013 -0700
two and two thirds
diff --git a/A b/A
index 575010a..5aef867 100644
--- a/A
+++ b/A
@@ -1,2 +1,3 @@
one
two and a third
+two and two thirds
commit 704d323ca1bc7c45ed8b1714d924adcdc83dfa44
Author: Rose Perrone <roseperrone@fake.com>
Date: Sun Jul 7 14:06:40 2013 -0700
two and a third
diff --git a/A b/A
index 5626abf..575010a 100644
--- a/A
+++ b/A
@@ -1 +1,2 @@
one
+two and a third
commit 9aac58f3893488ec643fecab3c85f5a2f481586f
Author: Rose Perrone <roseperrone@fake.com>
Date: Sun Jul 7 13:56:40 2013 -0700
one
diff --git a/A b/A
new file mode 100644
index 0000000..5626abf
--- /dev/null
+++ b/A
@@ -0,0 +1 @@
+one