Git 以分支的方式同時管理多個項目


你是否遇到過這樣的問題:

你的客戶在你們這邊做了N個項目,而項目之間又存在着某些業務關聯(數據庫訪問等)
之前你可能是這樣處理的,為客戶的每個項目創建單獨的Git版本
  • PC項目
  • 手機項目
  • 微信項目
  • 其他項目....


你是否有想過有其他的解決方法呢?比如在同一個Git倉庫對所有項目進行統一管理呢,那么該怎么使用Git來做到統一管理而又不會影響到各項目的工作呢?


當然使用萬能的Git分支完全可以滿足你這么個性化要求( 以分支的形式管理不同項目)
 
首頁你需要分支是必須要 創建的吧 (對應不同的項目)
那么問題來了,后創建的分支默認是以當前分支為父分支的,像下面這樣:"master-dev"的父分支是master
既然Git在創建是默認給我們的新分支指定了父親,那么可不可以在創建是不需要呢?
 
強大的Git同樣提供了解決方法(創建時提供 --orphan   參數即可 ):git checkout --orphan 分支名
注意:
盡管創建分支時沒有了父分支,但創建成功后,原分支的文件會在創建時添加到當前暫存區的,所以需要移除(不需要的情況下
然后再將原分支的文件從當前分支倉庫中移除,這樣你的分支里的文件對於其他分支來說就是獨一無二的了(即使不移除原分支的文件,此文件也是新添加到當前分支的,所以跟其他分支沒有任何關系)
而其他分支也完全不可能會影響你當前分支的工作( 不存在依賴關系的前提下)
 
當切換到PC分支時,Git倉庫里的文件也會發生變化,也就實現了我們的目的
不同的分支其實就是不同的目錄和文件,跟其他分支沒有關系的
提交記錄應該是這樣子的
可以看到下面pc分支的提交連接線(藍色)跟其他的連接線(綠色)是不同的
master-dev是在master上創建的子分支( 存在依賴關系)
20150821110536.png
QQ截圖20150821110633.jpg
以同樣的方式創建分支mobile,同樣沒有父親, git checkout  --orphan  mobile
QQ截圖20150821113345.jpg
 
然后在不同分支進行模擬提交,那么提交記錄就有可能是這樣的
應用場景不同,請謹慎使用,否則提交歷史將慘不忍睹
QQ截圖20150821113517.jpg
QQ截圖20150821113733.jpg
QQ截圖20150821113840.jpg
最終的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>

  

 
參考:
          git show-branch輸出






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM