Tạo một nhánh trống mới cho một dự án mới


351

Chúng tôi đang sử dụng kho git để lưu trữ dự án của chúng tôi. Chúng tôi có các chi nhánh của chúng tôi khởi hành từ chi nhánh ban đầu. Nhưng bây giờ chúng tôi muốn tạo một dự án nhỏ mới để theo dõi một số tài liệu. Vì vậy, chúng tôi muốn tạo một nhánh trống mới để bắt đầu lưu trữ các tệp của mình và tôi muốn những người dùng khác của mạng sao chép nhánh đó.

Làm thế nào chúng ta có thể làm điều đó?

Tôi đã thử một số thứ, nhưng chúng không hoạt động.

$ mkdir proj_doc; cd proj_doc
$ git init
$ git add .
$ git commit -m 'first commit'
$ git br proj_doc
$ git co proj_doc
$ git br -d master
$ git push origin proj_doc

Nó có vẻ đẩy chi nhánh ok, nhưng khi tôi thực hiện tìm nạp hoặc kéo, nó tải thông tin từ các chi nhánh khác, và sau đó tôi cũng nhận được một số tệp bổ sung từ các dự án khác. Giải pháp tốt nhất là gì?


11
Tại sao bạn cần lưu trữ này trong một chi nhánh? Các nhánh thường dành cho một số sai lệch so với cùng một cơ sở mã. Có lẽ chỉ cần bắt đầu một kho lưu trữ mới sẽ là một giải pháp tốt hơn.
Benjamin Bannier

2
Chà, chúng tôi đã làm điều đó trước đây, IIRC và tôi muốn làm lại, vì vậy tôi rất tò mò;)
fazineroso

3
"cho một dự án mới" - Như @honk tôi sẽ đề nghị đưa nó vào một kho lưu trữ mới. Hai tùy chọn từ đó để tích hợp chúng. Làm cho nó submoduletrong một dự án ban đầu, ví dụ như docs/chỉ vào repo khác. Hoặc, nếu bạn muốn hợp nhất mã sau này, hãy thêm nó dưới dạng từ xa.
gertvdijk

1
Một nhược điểm nữa của phương pháp mồ côi là bạn cần giữ .gitignorecác tập tin của mình và cũng liên tục chuyển đổi giữa hai gốc (các nhánh). Vì vậy, tôi cũng cho cách tiếp cận repo mới, trong một thư mục mới, có cùng điều khiển từ xa và đẩy sang một nhánh khác.
simo

Câu trả lời:


666

Bạn có thể tạo một nhánh như một đứa trẻ mồ côi:

git checkout --orphan <branchname>

Điều này sẽ tạo ra một chi nhánh mới không có cha mẹ. Sau đó, bạn có thể xóa thư mục làm việc với:

git rm --cached -r .

và thêm các tệp tài liệu, cam kết chúng và đẩy chúng lên github.

Kéo hoặc tìm nạp sẽ luôn cập nhật thông tin cục bộ về tất cả các nhánh từ xa. Nếu bạn chỉ muốn kéo / lấy thông tin cho một nhánh từ xa duy nhất, bạn cần chỉ định nó.


18
Câu trả lời hay, nhưng thật khó chịu khi nhánh mới bắt đầu với tất cả các tệp (từ nhánh trước) được dàn dựng.
Matt Fenwick

12
Khi phát hành git checkout --orphan <branch>; Tôi không thấy bất kỳ danh sách <chi nhánh> trong git branch.
Santosh Kumar

51
Sau khi git checkout --orphanngười ta có thể sử dụng git reset --hardđể xóa các tập tin còn sót lại.
Ilya Kozhevnikov

16
Lý do tại sao bạn không thấy chi nhánh sau đó git checkout --orphan <branch>là vì nó chưa có bất kỳ cam kết nào. Sau khi cam kết đầu tiên git branchin chi nhánh mới.
Krøllebølle

13
git clean -fd loại bỏ các tập tin không bị theo dõi.
stefgosselin

71

Câu trả lời đúng là tạo ra một nhánh mồ côi. Tôi giải thích làm thế nào để làm điều này chi tiết trên blog của tôi. (Liên kết lưu trữ)

...

Trước khi bắt đầu, hãy nâng cấp lên phiên bản GIT mới nhất. Để đảm bảo bạn đang chạy phiên bản mới nhất, hãy chạy

which git

Nếu nó tạo ra một phiên bản cũ, bạn có thể cần phải tăng PATH của mình với thư mục chứa phiên bản bạn vừa cài đặt.

Ok, chúng tôi đã sẵn sàng. Sau khi thực hiện một cd vào thư mục chứa thanh toán git của bạn, hãy tạo một nhánh mồ côi. Trong ví dụ này, tôi sẽ đặt tên cho chi nhánh là mybranch.

git checkout --orphan mybranch

Xóa mọi thứ trong nhánh mồ côi

git rm -rf .

Thực hiện một số thay đổi

vi README.txt

Thêm và cam kết thay đổi

git add README.txt
git commit -m "Adding readme file"

Đó là nó. Nếu bạn chạy

git log

bạn sẽ nhận thấy rằng lịch sử cam kết bắt đầu từ đầu. Để chuyển về nhánh chính của bạn, chỉ cần chạy

git checkout master

Bạn có thể trở về chi nhánh mồ côi bằng cách chạy

git checkout mybranch

16
Câu trả lời chỉ liên kết không được khuyến khích. Nếu liên kết được di chuyển hoặc loại bỏ, câu trả lời của bạn trở nên vô giá trị. Xem xét thêm các phần thiết yếu thẳng vào câu trả lời này. Đặc biệt chú ý đến những vấn đề không được nêu trong câu trả lời trước.
bytebuster

3
Liên kết không còn hiệu lực nữa, thật không may.
Alexey

1
Lưu trữ là một điều tuyệt vời.
lucid_dreamer

3
Thật khó khăn khi chỉ xóa mọi thứ trong thư mục làm việc, bởi vì bất kỳ dự án không tầm thường nào cũng sẽ có các tệp không bị theo dõi (cấu hình, môi trường, bộ đệm, v.v.).
Slava Fomin II

12

Tạo một nhánh mới trống như thế này:

true | git mktree | xargs git commit-tree | xargs git branch proj-doc

Nếu các tệp proj-doc của bạn đã được xác nhận trong một thư mục con, bạn có thể tạo nhánh mới theo cách này:

git commit-tree thatcommit:path/to/dir | xargs git branch proj-doc

mà có thể được thuận tiện hơn git branch --orphannếu điều đó sẽ để lại cho bạn rất nhiều git rmgit mving để làm.

Thử

git branch --set-upstream proj-doc origin/proj-doc

và xem nếu điều đó giúp với vấn đề tìm nạp quá nhiều của bạn. Ngoài ra nếu bạn thực sự chỉ muốn tìm nạp một nhánh duy nhất thì an toàn nhất là chỉ định nó trên dòng lệnh.


1
Câu trả lời này rất thú vị vì nó cho phép bạn bắt đầu một nhánh / root khác với cam kết đầu tiên hoàn toàn trống rỗng.
Stéphane Gourichon

Một cách khác để làm cho một chi nhánh trống nếu bạn không nhớ chuyển sang nó làgit checkout --orphan new-branch; git reset --hard
jthill

Việc sử dụng là xargsgì?
Flux

@Flux nó chỉ là một cách khác để nhận id cây dưới dạng đối số cây cam kết.
jthill

Tôi thực sự thích cách tiếp cận này, vì điều này cho phép tạo ra một nhánh mới trống, mà không cần rời khỏi nhánh hiện tại của bạn, cộng với thực tế đó là một cam kết trống làm điểm bắt đầu.
Brice

8

Nếu phiên bản git của bạn không có tùy chọn - định dạng, nên sử dụng phương pháp này:

git symbolic-ref HEAD refs/heads/<newbranch> 
rm .git/index 
git clean -fdx 

Sau khi làm một số công việc:

git add -A
git commit -m <message>
git push origin <newbranch>

2
Hãy cẩn thận, git cleancó thể xóa các tập tin bạn không muốn xóa! Chạy git clean -ndxtrước để xem tập tin nào sẽ xóa trước khi bạn chạy thật với -ftùy chọn.
Lassi

7

Giả sử bạn có một masterchi nhánh với các tệp / thư mục:

> git branch  
master
> ls -la # (files and dirs which you may keep in master)
.git
directory1
directory2
file_1
..
file_n

Từng bước làm thế nào để tạo một nhánh trống:

  1. git checkout —orphan new_branch_name
  2. Hãy chắc chắn rằng bạn đang ở đúng thư mục trước khi thực hiện lệnh sau:
    ls -la |awk '{print $9}' |grep -v git |xargs -I _ rm -rf ./_
  3. git rm -rf .
  4. touch new_file
  5. git add new_file
  6. git commit -m 'added first file in the new branch'
  7. git push origin new_branch_name

Trong bước 2, chúng tôi chỉ cần xóa tất cả các tệp cục bộ để tránh nhầm lẫn với các tệp trên nhánh mới của bạn và các tệp bạn giữ trong masternhánh. Sau đó, chúng tôi hủy liên kết tất cả các tệp trong bước 3. Cuối cùng, bước 4 và sau khi làm việc với nhánh trống mới của chúng tôi.

Khi bạn đã hoàn tất, bạn có thể dễ dàng chuyển đổi giữa các chi nhánh của mình:

git checkout master 
git checkout new_branch

1

Trên cơ sở câu trả lời này từ Hiery Nomus .

Bạn có thể tạo một nhánh như một đứa trẻ mồ côi:

git checkout --orphan <branchname>

Điều này sẽ tạo ra một chi nhánh mới không có cha mẹ. Sau đó, bạn có thể xóa thư mục làm việc với:

git rm --cached -r .

Và sau đó bạn chỉ cần xác nhận chi nhánh với cam kết trống và sau đó đẩy

git commit -m <commit message> --allow-empty
git push origin <newbranch>

1

Kiểm tra tài liệu này , nó có chi tiết rõ ràng về

--orphan <new_branch>
Tạo một nhánh mồ côi mới, được đặt tên <new_branch>, bắt đầu từ <start_point>và chuyển sang nó. Cam kết đầu tiên được thực hiện trên chi nhánh mới này sẽ không có cha mẹ và nó sẽ là gốc rễ của một lịch sử mới hoàn toàn bị ngắt kết nối với tất cả các chi nhánh và cam kết khác.

Chỉ mục và cây làm việc được điều chỉnh như thể trước đây bạn đã chạy kiểm tra git. Điều này cho phép bạn bắt đầu một lịch sử mới ghi lại một tập hợp các đường dẫn tương tự bằng cách dễ dàng chạy git commit -a để thực hiện cam kết gốc.


1
Liên kết đến một giải pháp được hoan nghênh, nhưng vui lòng đảm bảo câu trả lời của bạn hữu ích mà không cần đến nó: thêm ngữ cảnh xung quanh liên kết để người dùng của bạn sẽ có ý tưởng về nó là gì và tại sao lại có, sau đó trích dẫn phần có liên quan nhất của trang bạn ' liên kết lại trong trường hợp trang đích không có sẵn. Câu trả lời ít hơn một liên kết có thể bị xóa.
Yunnosch

1

tôi tìm thấy sự giúp đỡ này:

git checkout --orphan empty.branch.name
git rm --cached -r .
echo "init empty branch" > README.md
git add README.md
git commit -m "init empty branch"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.