2013-02-22 25 views
93

Tôi muốn xác định nhánh "root" mới trong kho git này. Bởi nhánh "root", tôi có nghĩa là một nhánh hoàn toàn độc lập với tất cả các nhánh khác trong kho lưu trữ .Cách tạo chi nhánh mới (và trống!) "Root"?

Thật không may, ngay cả cam kết (chúng ta hãy gọi nó là A) ở chính gốc của cây cam kết của repo chứa rất nhiều tệp (đây là kho lưu trữ đã được khởi tạo trên một dự án đã trưởng thành).

Điều này có nghĩa rằng ngay cả khi tôi đã A là chi nhánh mới của <start-point>, chi nhánh mới này sẽ không bắt đầu từ một "slate sạch", nhưng thay vì nó sẽ chứa tất cả các tập tin đã được cam kết trong A.

Có cách nào để tôi có thể tạo chi nhánh hoàn toàn trống trong kho lưu trữ này, với <start-point> càng gần với A càng tốt?


BTW, đây là không tương đương với việc tạo ra một repo mới. Repos riêng biệt sẽ ít thuận tiện hơn vì nhiều lý do.


EDIT: OK, đây là những gì tôi đã làm, dựa trên vcsjones 'câu trả lời:

# save rev of the current earliest commit 
OLDBASE=$(git rev-list --max-parents=0 HEAD) 

# create a new orphan branch and switch to it 
git checkout --orphan newbranch 
# make sure it's empty 
git rm -rf . 

# create a new empty commit in the new branch, and 
# save its rev in NEWBASE 
git commit --allow-empty -m 'base commit (empty)' 
NEWBASE=$(git rev-list HEAD) 

# specify $NEWBASE as the new parent for $OLDBASE, and 
# run filter-branch on the original branch 
echo "$OLDBASE $NEWBASE" > .git/info/grafts 
git checkout master 
git filter-branch 

# NOTE: this assumes that the original repo had only one 
# branch; if not, a git-filter-branch -f <branch> command 
# need to be run for each additional branch. 

rm .git/info/grafts 

Mặc dù thủ tục này là một chút liên quan, kết quả cuối cùng là một trống cam kết cơ sở có thể đóng vai trò là <start-point> cho bất kỳ "chi nhánh đá phiến sạch" mới nào; tất cả tôi cần phải làm sau đó là

git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD) 

Trong tương lai tôi sẽ luôn luôn tạo ra các kho mới như thế này:

git init 
git commit --allow-empty -m 'base commit (empty)' 

... để là người đầu tiên cam kết là trống, và luôn luôn có sẵn để bắt đầu một chi nhánh độc lập mới. (Đây sẽ là, tôi biết, một cơ sở rất hiếm khi cần thiết, nhưng nó là khá nỗ lực để làm cho nó có sẵn.)

+0

Duplicate của http://stackoverflow.com/questions/13969050/how-to-create-a-new-empty-branch-for-a-new-project – Anonymoose

+1

@ Anonymoose: Chỉ cần cho hồ sơ (thay vì tranh luận): Tôi không đồng ý với ý kiến ​​của bạn. – kjo

+1

Dường như có một giải pháp đơn giản hơn nhiều dựa trên 'git rebase --onto', xem http://stackoverflow.com/questions/645450/insert-a-commit-before-the-root-commit-in-git –

Trả lời

151

Sử dụng --orphan khi tạo các chi nhánh:

git checkout --orphan YourBranchName 

này sẽ tạo ra một mới chi nhánh với số không cam kết trên nó, tuy nhiên tất cả các tập tin của bạn sẽ được tổ chức. Tại thời điểm đó bạn chỉ có thể loại bỏ chúng.
("loại bỏ chúng": Một git reset --hard sẽ trống rỗng chỉ mục, để lại cho bạn một cây làm việc trống)

Hãy nhìn vào các man page cho kiểm tra để biết thêm thông tin về --orphan.

+0

Điều này về cơ bản tạo ra một phiến đá trống? Như trong, từ đầu? Hay nó giữ tất cả các thay đổi trước đó của bạn, nhưng không phải trong lịch sử git? –

+1

@ConAntonakos Điều này tạo ra một chi nhánh mới mà không có cha mẹ. Các nhánh khác không bị ảnh hưởng, tất cả các thay đổi của chúng được giữ lại. – fuz

1

Để thêm vào câu trả lời được chấp nhận - best practice để hoàn nguyên về trạng thái sạch là tạo an initial empty commit để bạn có thể dễ dàng rebase trong khi thiết lập chi nhánh của bạn cho hậu thế. Thêm vào đó, vì bạn muốn có một trạng thái sạch, có thể bạn đã cam kết các tệp mà bạn không nên, vì vậy bạn phải loại bỏ chúng khỏi chỉ mục.Với những người trong tâm trí bạn nên:

$ git checkout --orphan dev2 
Switched to a new branch 'dev2' 
$ git reset # unstage all the files, you probably don't want to commit all of them 
$ git commit --allow-empty -m 'Initial empty commit' 
[dev2 (root-commit) a515c28] Initial empty commit 
Các vấn đề liên quan