2015-07-28 16 views
8

Tôi cần phải đặt tất cả các cam kết của tôi trong một cái gọi là snapshot ban đầu, để phát hành nó trong một repo github, tôi biết rằng để làm điều này tôi làm theo thisSquash tất cả các cam kết của bạn trong một, trước khi một yêu cầu kéo trong github

câu hỏi đầu tiên của tôi là tôi muốn chia sẻ nó với một kho lưu trữ bên ngoài và điều này nói:

một lời cảnh báo: Chỉ làm điều này trên các cam kết chưa được đẩy một kho bên ngoài. Nếu những người khác làm việc dựa trên các cam kết rằng bạn sẽ xóa, nhiều xung đột có thể xảy ra. Chỉ cần không viết lại lịch sử của bạn nếu lịch sử được chia sẻ với người khác.

và những gì xảy ra tôi muốn đặt tất cả các cam kết của mình trong một duy nhất, làm thế nào để làm điều này:

Tôi cũng thấy điều này:

# Switch to the master branch and make sure you are up to date. 
git checkout master 
git fetch # this may be necessary (depending on your git config) to receive updates on origin/master 
git pull 

# Merge the feature branch into the master branch. 
git merge feature_branch 

# Reset the master branch to origin's state. 
git reset origin/master 

# Git now considers all changes as unstaged changes. 
# We can add these changes as one commit. 
# Adding . will also add untracked files. 
git add --all 
git commit 

nhưng có gì xảy ra:

$ git reset origin/master 
$ git add --all 
$ git commit -m "initial snapshot" 
On branch master 
Your branch is up-to-date with 'origin/master'. 
nothing to commit, working directory clean 
+0

gì bạn nhận được từ 'git rev-phân tích cú pháp tổng thể nguồn gốc/master'?Có vẻ như trước khi chạy 'git reset', bạn có thể đã bỏ công việc của mình. Đừng lo lắng nếu bạn có, như bạn có thể tìm thấy nó trong reflog ('git log -g'). – user3188445

+0

Đây là những gì tôi nhận được: $ git rev-parse master origin/master 78c4e31d7f813a127603aa93d63eb2c9db8d7c47 78c4e31d7f813a127603aa93d63eb2c9db8d7c47 – anquegi

+0

Được rồi, vì vậy chính là trở lại nguồn gốc/chủ. Và liệu 'git diff' hoặc' git diff --cached HEAD' có cho thấy bất kỳ thay đổi nào trong cây hoặc chỉ mục của bạn không? Nếu không, bạn có thể phải tìm nội dung của chủ nhân bị mất của bạn với 'git log -g'. – user3188445

Trả lời

18

Cách dễ nhất để làm điều đó là sử dụng lệnh rebase.

Hãy tưởng tượng bạn có kho lưu trữ này:

$> git log --oneline 
af28aeb Another test 
a680317 Try something 
d93792b Edit both files 
f23cdbd Second commit add b 
6f456bc First commit add a 

Vì vậy, bạn đã thực hiện một số thử nghiệm với cam kết af28aeb Another testa680317 Try something. Chúng tôi muốn đánh bóng chúng sau d93792b Edit both files để làm sạch kho lưu trữ.

Để làm điều đó lệnh sẽ git rebase -i d93792b

đâu -i là để chỉ cho nhập vào trong chế độ tương tác và d93792b là băm cam kết mà chúng tôi muốn absorbe trước đó.

Lưu ý: trong trường hợp bạn muốn dẹp tất cả các cam kết của bạn như là người đầu tiên, bạn phải sử dụng git rebase --root -i

Đó lệnh sẽ cho bạn thấy rằng:

pick a680317 Try something 
pick af28aeb Another test 

# Rebase d93792b..af28aeb onto d93792b (  2 TODO item(s)) 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# x, exec = run command (the rest of the line) using shell 
# 
# These lines can be re-ordered; they are executed from top to bottom. 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# 
# However, if you remove everything, the rebase will be aborted. 
# 
# Note that empty commits are commented out 

Bạn phải nói với lệnh rebase những gì bạn muốn làm. Trong trường hợp đó, tôi đề nghị bạn viết lại cam kết đầu tiên và đánh số thứ hai như sau:

reword a680317 Try something 
squash af28aeb Another test 

# Rebase d93792b..af28aeb onto d93792b (  2 TODO item(s)) 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# x, exec = run command (the rest of the line) using shell 
# 
# These lines can be re-ordered; they are executed from top to bottom. 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# 
# However, if you remove everything, the rebase will be aborted. 
# 
# Note that empty commits are commented out 

Sau đó, chỉnh sửa văn bản của bạn sẽ được mở để đặt thông báo cam kết mới.

Fix bug 

# Please enter the commit message for your changes. Lines starting 
# with '#' will be ignored, and an empty message aborts the commit. 
# 
# Date:  Tue Jul 28 08:40:04 2015 +0200 
# 
# rebase in progress; onto d93792b 
# You are currently editing a commit while rebasing branch 'master' on 'd93792b'. 
# 
# Changes to be committed: 
#  new file: c 
# 

Bây giờ bạn phải git commit --amendgit rebase --continue để kết thúc quá trình.

Và kho của bạn sẽ hiển thị như thế này:

$> git log --oneline 
5f98806 Fix bug 
d93792b Edit both files 
f23cdbd Second commit add b 
6f456bc First commit add a 
Các vấn đề liên quan