你是否遇到過這樣的問題:
你的客戶在你們這邊做了N個項目,而項目之間又存在着某些業務關聯(數據庫訪問等)
之前你可能是這樣處理的,為客戶的每個項目創建單獨的Git版本
|
![]() |
你是否有想過有其他的解決方法呢?比如在同一個Git倉庫對所有項目進行統一管理呢,那么該怎么使用Git來做到統一管理而又不會影響到各項目的工作呢?
當然使用萬能的Git分支完全可以滿足你這么個性化要求(
以分支的形式管理不同項目)
首頁你需要分支是必須要
創建的吧
(對應不同的項目)
那么問題來了,后創建的分支默認是以當前分支為父分支的,像下面這樣:"master-dev"的父分支是master

既然Git在創建是默認給我們的新分支指定了父親,那么可不可以在創建是不需要呢?
強大的Git同樣提供了解決方法(創建時提供
--orphan
參數即可
):git checkout
--orphan
分支名
注意:
盡管創建分支時沒有了父分支,但創建成功后,原分支的文件會在創建時添加到當前暫存區的,所以需要移除(不需要的情況下)
然后再將原分支的文件從當前分支倉庫中移除,這樣你的分支里的文件對於其他分支來說就是獨一無二的了(即使不移除原分支的文件,此文件也是新添加到當前分支的,所以跟其他分支沒有任何關系)
而其他分支也完全不可能會影響你當前分支的工作(
不存在依賴關系的前提下)

當切換到PC分支時,Git倉庫里的文件也會發生變化,也就實現了我們的目的
不同的分支其實就是不同的目錄和文件,跟其他分支沒有關系的

提交記錄應該是這樣子的

可以看到下面pc分支的提交連接線(藍色)跟其他的連接線(綠色)是不同的
master-dev是在master上創建的子分支(
存在依賴關系)


以同樣的方式創建分支mobile,同樣沒有父親,
git checkout
--orphan
mobile

然后在不同分支進行模擬提交,那么提交記錄就有可能是這樣的
應用場景不同,請謹慎使用,否則提交歷史將慘不忍睹




最終的Git分支和對應的目錄及文件是這樣的,現在你可以在一個Git里愉快的玩耍了
技術有風險使用請謹慎
技術有風險使用請謹慎
技術有風險使用請謹慎
重要的事情說三遍

舉個栗子:
F:\Demo\D11>tree /F 文件夾 PATH 列表 卷序列號為 A627-5B49 F:. └─master main.txt F:\Demo\D11>git status fatal: Not a git repository (or any of the parent directories): .git F:\Demo\D11>git init Initialized empty Git repository in F:/Demo/D11/.git/ F:\Demo\D11>git status On branch master Initial commit Untracked files: (use "git add <file>..." to include in what will be committed) master/ nothing added to commit but untracked files present (use "git add" to track) F:\Demo\D11>git add --all F:\Demo\D11>git status On branch master Initial commit Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: master/main.txt F:\Demo\D11>git commit -a -m "master branch init" [master (root-commit) 3ae67eb] master branch init 1 file changed, 1 insertion(+) create mode 100644 master/main.txt F:\Demo\D11>git commit -a -m "master edit" [master 60197ce] master edit 1 file changed, 3 insertions(+), 1 deletion(-) F:\Demo\D11>git checkout -b "master-dev" Switched to a new branch 'master-dev' F:\Demo\D11>git status On branch master-dev Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: master/main.txt no changes added to commit (use "git add" and/or "git commit -a") F:\Demo\D11>git commit -a -m "master-dev edit" [master-dev 67837dd] master-dev edit 1 file changed, 3 insertions(+), 1 deletion(-) F:\Demo\D11>git show-branch ! [master] master edit * [master-dev] master-dev edit -- * [master-dev] master-dev edit +* [master] master edit F:\Demo\D11>git tree --all WARNING: terminal is not fully functional * 67837dd (HEAD, master-dev) master-dev edit * 60197ce (master) master edit * 3ae67eb master branch init F:\Demo\D11>git citool F:\Demo\D11>git checkout --orphan pc Switched to a new branch 'pc' F:\Demo\D11>git status On branch pc Initial commit Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: master/main.txt Untracked files: (use "git add <file>..." to include in what will be committed) pc/ F:\Demo\D11>git rm -r master/ rm 'master/main.txt' F:\Demo\D11>RD /S master/ f:\demo\d11\master, 是否確認(Y/N)? Y F:\Demo\D11>tree /F 文件夾 PATH 列表 卷序列號為 A627-5B49 F:. └─pc pc.txt F:\Demo\D11>git add --all F:\Demo\D11>git commit -a -m "pc/pc init" [pc (root-commit) 3e176c6] pc/pc init 1 file changed, 1 insertion(+) create mode 100644 pc/pc.txt F:\Demo\D11>git show-branch ! [master] master edit ! [master-dev] master-dev edit * [pc] pc/pc init --- * [pc] pc/pc init + [master-dev] master-dev edit ++ [master] master edit ++ [master^] master branch init F:\Demo\D11>git tree --all WARNING: terminal is not fully functional * 3e176c6 (HEAD, pc) pc/pc init * 67837dd (master-dev) master-dev edit * 60197ce (master) master edit * 3ae67eb master branch init F:\Demo\D11>git status On branch pc Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: pc/pc.txt no changes added to commit (use "git add" and/or "git commit -a") F:\Demo\D11>git commit -a -m "pc edit" [pc d1f98d3] pc edit 1 file changed, 3 insertions(+), 1 deletion(-) F:\Demo\D11>git commit -a -m "pc reedit" [pc 2fd85bf] pc reedit 1 file changed, 3 insertions(+), 1 deletion(-) F:\Demo\D11>git show-branch ! [master] master edit ! [master-dev] master-dev edit * [pc] pc reedit --- * [pc] pc reedit * [pc^] pc edit * [pc~2] pc/pc init + [master-dev] master-dev edit ++ [master] master edit ++ [master^] master branch init F:\Demo\D11>git tree --all WARNING: terminal is not fully functional * 2fd85bf (HEAD, pc) pc reedit * d1f98d3 pc edit * 3e176c6 pc/pc init * 67837dd (master-dev) master-dev edit * 60197ce (master) master edit * 3ae67eb master branch init F:\Demo\D11>git checkout "master-dev" Switched to branch 'master-dev' F:\Demo\D11>git diff WARNING: terminal is not fully functional diff --git a/master/main.txt b/master/main.txt index 75bf703..5a345f8 100644 --- a/master/main.txt +++ b/master/main.txt @@ -2,4 +2,6 @@ main/main init master edit -master-dev edit \ No newline at end of file +master-dev edit +master-dev reedit + F:\Demo\D11>git commit -a -m "master-dev reedit" [master-dev 67cec74] master-dev reedit 1 file changed, 3 insertions(+), 1 deletion(-) F:\Demo\D11>git show-branch ! [master] master edit * [master-dev] master-dev reedit ! [pc] pc reedit --- * [master-dev] master-dev reedit * [master-dev^] master-dev edit +* [master] master edit +* [master^] master branch init + [pc] pc reedit + [pc^] pc edit + [pc~2] pc/pc init F:\Demo\D11>git tree --all WARNING: terminal is not fully functional * 67cec74 (HEAD, master-dev) master-dev reedit * 67837dd master-dev edit * 60197ce (master) master edit * 3ae67eb master branch init * 2fd85bf (pc) pc reedit * d1f98d3 pc edit * 3e176c6 pc/pc init F:\Demo\D11>git checkout master Switched to branch 'master' F:\Demo\D11>git commit -a -m "master reedit" [master b79efa5] master reedit 1 file changed, 3 insertions(+), 1 deletion(-) F:\Demo\D11>git show-branch * [master] master reedit ! [master-dev] master-dev reedit ! [pc] pc reedit --- * [master] master reedit + [master-dev] master-dev reedit + [master-dev^] master-dev edit *+ [master^] master edit *+ [master~2] master branch init + [pc] pc reedit + [pc^] pc edit + [pc~2] pc/pc init F:\Demo\D11>git tree --all WARNING: terminal is not fully functional * b79efa5 (HEAD, master) master reedit | * 67cec74 (master-dev) master-dev reedit | * 67837dd master-dev edit |/ * 60197ce master edit * 3ae67eb master branch init * 2fd85bf (pc) pc reedit * d1f98d3 pc edit * 3e176c6 pc/pc init F:\Demo\D11>git citool F:\Demo\D11>git checkout pc Switched to branch 'pc' F:\Demo\D11>git commit -a -m "pc re-reedit" [pc 1d24c39] pc re-reedit 1 file changed, 3 insertions(+), 1 deletion(-) F:\Demo\D11>git show-branch ! [master] master reedit ! [master-dev] master-dev reedit * [pc] pc re-reedit --- * [pc] pc re-reedit * [pc^] pc reedit * [pc~2] pc edit * [pc~3] pc/pc init + [master] master reedit + [master-dev] master-dev reedit + [master-dev^] master-dev edit ++ [master^] master edit ++ [master~2] master branch init F:\Demo\D11>git tree --all WARNING: terminal is not fully functional * 1d24c39 (HEAD, pc) pc re-reedit * 2fd85bf pc reedit * d1f98d3 pc edit * 3e176c6 pc/pc init * b79efa5 (master) master reedit | * 67cec74 (master-dev) master-dev reedit | * 67837dd master-dev edit |/ * 60197ce master edit * 3ae67eb master branch init F:\Demo\D11>git checkout --orphan mobile Switched to a new branch 'mobile' F:\Demo\D11>git status On branch mobile Initial commit Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: pc/pc.txt Untracked files: (use "git add <file>..." to include in what will be committed) mobile/ F:\Demo\D11>tree /F 文件夾 PATH 列表 卷序列號為 A627-5B49 F:. ├─mobile │ mobile.txt │ └─pc F:\Demo\D11>RD /S f:\demo\d11\pc f:\demo\d11\pc, 是否確認(Y/N)? Y F:\Demo\D11>tree /F 文件夾 PATH 列表 卷序列號為 A627-5B49 F:. └─mobile mobile.txt F:\Demo\D11>git status On branch mobile Initial commit Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: pc/pc.txt Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: pc/pc.txt Untracked files: (use "git add <file>..." to include in what will be committed) mobile/ F:\Demo\D11>git rm -r pc/ rm 'pc/pc.txt' F:\Demo\D11>git status On branch mobile Initial commit Untracked files: (use "git add <file>..." to include in what will be committed) mobile/ nothing added to commit but untracked files present (use "git add" to track) F:\Demo\D11>git add --all F:\Demo\D11>git commit -a -m "pc/pc master init" [mobile (root-commit) a94d110] pc/pc master init 1 file changed, 1 insertion(+) create mode 100644 mobile/mobile.txt F:\Demo\D11>git show-branch ! [master] master reedit ! [master-dev] master-dev reedit * [mobile] pc/pc master init ! [pc] pc re-reedit ---- * [mobile] pc/pc master init + [pc] pc re-reedit + [pc^] pc reedit + [pc~2] pc edit + [pc~3] pc/pc init + [master] master reedit + [master-dev] master-dev reedit + [master-dev^] master-dev edit ++ [master^] master edit ++ [master~2] master branch init F:\Demo\D11>git tree --all WARNING: terminal is not fully functional * a94d110 (HEAD, mobile) pc/pc master init * 1d24c39 (pc) pc re-reedit * 2fd85bf pc reedit * d1f98d3 pc edit * 3e176c6 pc/pc init * b79efa5 (master) master reedit | * 67cec74 (master-dev) master-dev reedit | * 67837dd master-dev edit |/ * 60197ce master edit * 3ae67eb master branch init F:\Demo\D11>git show-branch ! [master] master reedit ! [master-dev] master-dev reedit * [mobile] pc/pc master init ! [pc] pc re-reedit ---- * [mobile] pc/pc master init + [pc] pc re-reedit + [pc^] pc reedit + [pc~2] pc edit + [pc~3] pc/pc init + [master] master reedit + [master-dev] master-dev reedit + [master-dev^] master-dev edit ++ [master^] master edit ++ [master~2] master branch init F:\Demo\D11>git commit -a -m "mobile edit" [mobile de5452e] mobile edit 1 file changed, 3 insertions(+), 1 deletion(-) F:\Demo\D11>git commit -a -m "mobile re-edit" [mobile 70dc006] mobile re-edit 1 file changed, 3 insertions(+), 1 deletion(-) F:\Demo\D11>git show-branch ! [master] master reedit ! [master-dev] master-dev reedit * [mobile] mobile re-edit ! [pc] pc re-reedit ---- * [mobile] mobile re-edit * [mobile^] mobile edit * [mobile~2] pc/pc master init + [pc] pc re-reedit + [pc^] pc reedit + [pc~2] pc edit + [pc~3] pc/pc init + [master] master reedit + [master-dev] master-dev reedit + [master-dev^] master-dev edit ++ [master^] master edit ++ [master~2] master branch init F:\Demo\D11> F:\Demo\D11>git tree --all WARNING: terminal is not fully functional * 70dc006 (HEAD, mobile) mobile re-edit * de5452e mobile edit * a94d110 pc/pc master init * 1d24c39 (pc) pc re-reedit * 2fd85bf pc reedit * d1f98d3 pc edit * 3e176c6 pc/pc init * b79efa5 (master) master reedit | * 67cec74 (master-dev) master-dev reedit | * 67837dd master-dev edit |/ * 60197ce master edit * 3ae67eb master branch init F:\Demo\D11>git checkout "master-dev" Switched to branch 'master-dev' F:\Demo\D11>git commit -a -m "master-dev re-reedit" [master-dev 1c57e77] master-dev re-reedit 1 file changed, 2 insertions(+) F:\Demo\D11>git show-branch ! [master] master reedit * [master-dev] master-dev re-reedit ! [mobile] mobile re-edit ! [pc] pc re-reedit ---- * [master-dev] master-dev re-reedit * [master-dev^] master-dev reedit * [master-dev~2] master-dev edit + [mobile] mobile re-edit + [mobile^] mobile edit + [mobile~2] pc/pc master init + [pc] pc re-reedit + [pc^] pc reedit + [pc~2] pc edit + [pc~3] pc/pc init + [master] master reedit +* [master-dev~3] master edit +* [master-dev~4] master branch init F:\Demo\D11>git tree --all WARNING: terminal is not fully functional * 1c57e77 (HEAD, master-dev) master-dev re-reedit * 67cec74 master-dev reedit * 67837dd master-dev edit | * 70dc006 (mobile) mobile re-edit | * de5452e mobile edit | * a94d110 pc/pc master init | * 1d24c39 (pc) pc re-reedit | * 2fd85bf pc reedit | * d1f98d3 pc edit | * 3e176c6 pc/pc init | * b79efa5 (master) master reedit |/ * 60197ce master edit * 3ae67eb master branch init F:\Demo\D11>git checkout master Switched to branch 'master' F:\Demo\D11>git commit -a -m "master re-reedit" [master a0a0f1a] master re-reedit 1 file changed, 3 insertions(+), 1 deletion(-) F:\Demo\D11>git show-branch * [master] master re-reedit ! [master-dev] master-dev re-reedit ! [mobile] mobile re-edit ! [pc] pc re-reedit ---- * [master] master re-reedit * [master^] master reedit + [master-dev] master-dev re-reedit + [master-dev^] master-dev reedit + [master-dev~2] master-dev edit *+ [master~2] master edit *+ [master~3] master branch init + [mobile] mobile re-edit + [mobile^] mobile edit + [mobile~2] pc/pc master init + [pc] pc re-reedit + [pc^] pc reedit + [pc~2] pc edit + [pc~3] pc/pc init F:\Demo\D11>git tree --all WARNING: terminal is not fully functional * a0a0f1a (HEAD, master) master re-reedit * b79efa5 master reedit | * 1c57e77 (master-dev) master-dev re-reedit | * 67cec74 master-dev reedit | * 67837dd master-dev edit |/ * 60197ce master edit * 3ae67eb master branch init * 70dc006 (mobile) mobile re-edit * de5452e mobile edit * a94d110 pc/pc master init * 1d24c39 (pc) pc re-reedit * 2fd85bf pc reedit * d1f98d3 pc edit * 3e176c6 pc/pc init F:\Demo\D11>git checkout pc Deletion of directory 'master' failed. Should I try again? (y/n) n Switched to branch 'pc' F:\Demo\D11>git status On branch pc nothing to commit, working directory clean F:\Demo\D11>git commit -a -m "pc re-re-reedit" [pc 0f657c0] pc re-re-reedit 1 file changed, 3 insertions(+), 1 deletion(-) F:\Demo\D11>git show-branch ! [master] master re-reedit ! [master-dev] master-dev re-reedit ! [mobile] mobile re-edit * [pc] pc re-re-reedit ---- * [pc] pc re-re-reedit * [pc^] pc re-reedit * [pc~2] pc reedit * [pc~3] pc edit * [pc~4] pc/pc init + [master] master re-reedit + [master^] master reedit + [master-dev] master-dev re-reedit + [master-dev^] master-dev reedit + [master-dev~2] master-dev edit ++ [master~2] master edit ++ [master~3] master branch init + [mobile] mobile re-edit + [mobile^] mobile edit + [mobile~2] pc/pc master init F:\Demo\D11>git tree --all WARNING: terminal is not fully functional * 0f657c0 (HEAD, pc) pc re-re-reedit * 1d24c39 pc re-reedit * 2fd85bf pc reedit * d1f98d3 pc edit * 3e176c6 pc/pc init * a0a0f1a (master) master re-reedit * b79efa5 master reedit | * 1c57e77 (master-dev) master-dev re-reedit | * 67cec74 master-dev reedit | * 67837dd master-dev edit |/ * 60197ce master edit * 3ae67eb master branch init * 70dc006 (mobile) mobile re-edit * de5452e mobile edit * a94d110 pc/pc master init F:\Demo\D11>git checkout "master-dev" Deletion of directory 'pc' failed. Should I try again? (y/n) n Switched to branch 'master-dev' F:\Demo\D11>git commit -a -m "master-dev re-re-reedit" [master-dev a6be472] master-dev re-re-reedit 1 file changed, 1 insertion(+) F:\Demo\D11>git show-branch ! [master] master re-reedit * [master-dev] master-dev re-re-reedit ! [mobile] mobile re-edit ! [pc] pc re-re-reedit ---- * [master-dev] master-dev re-re-reedit * [master-dev^] master-dev re-reedit * [master-dev~2] master-dev reedit * [master-dev~3] master-dev edit + [pc] pc re-re-reedit + [pc^] pc re-reedit + [pc~2] pc reedit + [pc~3] pc edit + [pc~4] pc/pc init + [master] master re-reedit + [master^] master reedit +* [master-dev~4] master edit +* [master-dev~5] master branch init + [mobile] mobile re-edit + [mobile^] mobile edit + [mobile~2] pc/pc master init F:\Demo\D11>git tree --all WARNING: terminal is not fully functional * a6be472 (HEAD, master-dev) master-dev re-re-reedit * 1c57e77 master-dev re-reedit * 67cec74 master-dev reedit * 67837dd master-dev edit | * 0f657c0 (pc) pc re-re-reedit | * 1d24c39 pc re-reedit | * 2fd85bf pc reedit | * d1f98d3 pc edit | * 3e176c6 pc/pc init | * a0a0f1a (master) master re-reedit | * b79efa5 master reedit |/ * 60197ce master edit * 3ae67eb master branch init * 70dc006 (mobile) mobile re-edit * de5452e mobile edit * a94d110 pc/pc master init F:\Demo\D11>git checkout pc Already on 'pc' F:\Demo\D11>git commit -a -m "pc re-re-re-reedit" [pc f906c94] pc re-re-re-reedit 1 file changed, 3 insertions(+), 1 deletion(-) F:\Demo\D11>
參考: