第一部分:git常用命令
<1>下載服務器代碼到本地: git clone 服務器代碼倉庫地址
<2>查看本地分支:git branch
<3>查看本地+遠程分支:git branch
<4>分支跳轉:git checkout 分支名
<5>將文件加入git管理:git add 文件名
<6>查看提交狀態:git status
<7>提交代碼:git commit 文件名 -m “說明”
<8>在父分支上下拉服務器(正本)代碼:git pull
<9>推送代碼到服務器(正本):git push(注意,這個命令執行前提是當前所在分支的分支名等於服務器分支名)
<10>查看提交歷史:git log -10 (10是想查看的歷史條數,可任意設置)
<11>版本回退:git reset --hard 提交歷史哈希串
<12>創建新分支:
[方式1]git branch 新分支名(只創建,不跳轉進去)
[方式2]git checkout -b 新分支名 (創建,且直接跳轉進去)
—————————————————————————————————————————————————————————————————————————————————————————————————————————————
第二部分:mac系統上安裝git
因爲Xcode自帶git中的rebase命令實際操作效果等同於merge命令,而無衝突提交需要的最重要的命令恰好是rebase,所以在mac系統上需要下載完整的git
步驟1:安裝包管理工具HomeBrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”
這一行代碼可能因爲複製格式問題在終端上直接執行不成功,去百度搜索homebrew,第一個就是HomeBrew的官網,其中有這條命令,直接拷貝下來執行
步驟2:通過brew命令安裝git
brew install git
—————————————————————————————————————————————————————————————————————————————————————————————————————————————
第三部分:git開發的四個分支介紹
【1】服務器代碼(遠端)正本分支,*一級提交分支
真正的服務器代碼倉庫,用於正式提交代碼,一般不可逆
【2】服務器代碼(本地)副本分支,*分佈式存儲、遠程跟蹤、協助提交
服務器代碼倉庫在本地的備份(副本),跟蹤服務器最新代碼,一套代碼在服務器和每個開發者的本地都有多份拷貝,這就實現了git的分佈式存儲,如果服務器壞了,任何一個開發者本地的副本都可以安全的保存完整代碼。
【3】父分支,*二級提交分支
父分支是本地的提交分支,開發者在本地做的開發先提交到父分支上,保證本地父分支無衝突(提交歷史爲一條直線),然後再把父分支提交到服務器正本分支上
【4】子分支,*開發分支,解決衝突
子分支用來做開發或者bug修改,子分支和本地副本分支配合,通過rebase命令,實現無衝突的提交,子分支的修改要通過父分支提交到正本分支上
—————————————————————————————————————————————————————————————————————————————————————————————————————————————
第四部分:提交流程(五個步驟 + 衝突解決)
1、(子分支)git fetch
將遠端正本分支的最新代碼同步到本地副本分支上來
2、(子分支)git rebase origin/父分支
將子分支和本地副本分支無衝突合併
3、(子分支)git checkout 父分支
切換到父分支
4、(父分支)git merge 子分支
將父分支和子分支無衝突合併,父分支上獲得子分支和遠端正本分支的最新修改
5、(父分支)git push
將父分支上子分支的最新修改提交給遠端正本分支
衝突解決:
正常情況下,會在以上步驟中的2、5兩步發生衝突:
(子分支)git rebase origin/父分支衝突:
協商解決衝突,解決完衝突之後執行:
git add . 把當前解決完衝突的文件添加至提交緩存
git rebase --continue 繼續執行未執行完畢的rebase命令
(父分支)git push衝突:
返回子分支,重新執行一遍1-5五個步驟,並在步驟2解決衝突
—————————————————————————————————————————————————————————————————————————————————————————————————————————————
第五部分:git rebase 命令的原理解釋:(參考http://gitbook.liuhui998.com/4_2.html)
假設你現在基於遠程分支"origin",創建一個叫"mywork"的分支。
$ git checkout -b mywork origin
現在我們在這個分支做一些修改,然後生成兩個提交(commit).
$ vi file.txt
$ git commit
$ vi otherfile.txt
$ git commit
...
但是與此同時,有些人也在"origin"分支上做了一些修改並且做了提交了. 這就意味着"origin"和"mywork"這兩個分支各自"前進"了,它們之間"分叉"了。
在這裏,你可以用"pull"命令把"origin"分支上的修改拉下來並且和你的修改合併; 結果看起來就像一個新的"合併的提交"(merge commit):
但是,如果你想讓"mywork"分支歷史看起來像沒有經過任何合併一樣,你也許可以用 git rebase:
$ git checkout mywork
$ git rebase origin
這些命令會把你的"mywork"分支裏的每個提交(commit)取消掉,並且把它們臨時 保存爲補丁(patch)(這些補丁放到".git/rebase"目錄中),然後把"mywork"分支更新 到最新的"origin"分支,最後把保存的這些補丁應用到"mywork"分支上。
當'mywork'分支更新之後,它會指向這些新創建的提交(commit),而那些老的提交會被丟棄。 如果運行垃圾收集命令(pruning garbage collection), 這些被丟棄的提交就會刪除. (請查看 git gc)
現在我們可以看一下用合併(merge)和用rebase所產生的歷史的區別:
在rebase的過程中,也許會出現衝突(conflict). 在這種情況,Git會停止rebase並會讓你去解決 衝突;在解決完衝突後,用"git-add"命令去更新這些內容的索引(index), 然後,你無需執行 git-commit,只要執行:
$ git rebase --continue
這樣git會繼續應用(apply)餘下的補丁。
在任何時候,你可以用--abort
參數來終止rebase的行動,並且"mywork" 分支會回到rebase開始前的狀態。
$ git rebase --abort
—————————————————————————————————————————————————————————————————————————————————————————————————————————————
第六部分:嘗試提交
現在有一個給大家嘗試提交的遠端倉庫:https://github.com/zhch1991/TestGitServer.git 這個遠端倉庫即爲:服務器代碼(遠端)正本分支
本地測試步驟:
1、創建一個新文件夾,進入新文件夾中,執行git初始化
mkdir test
cd test
git init
2、將遠端倉庫下載到本地
git clone https://github.com/zhch1991/TestGitServer.git
此時,執行ls查看,發現當前文件夾中多了:TestGitServer,這個TestGitServer就是從遠端倉庫上下載的代碼
3、進入到文件夾中進行代碼和分支查看
cd TestGitServer
git branch -a 此時應該能在分支列表中查看到分支 :remotes/origin/father,這個分支即爲:服務器代碼(本地)副本分支,*分佈式存儲、遠程跟蹤、協助提交
4、根據 服務器代碼(本地)副本分支 創建 父分支
git checkout -b father origin/father
git branch -a 此時應該能在分支列表中查看到分支 :father,這個分支即爲父分支
5、根據父分支創建子分支
git checkout -b son
git branch -a 此時應該能在分支列表中查看到分支 :son,這個分支即爲子分支
準備工作完成,在子分支上進行修改,然後按照第四部分提交流程提交即可
—————————————————————————————————————————————————————————————————————————————————————————————————————————————
第七部分:可能出現的問題
mac系統終端上執行git push或 git pull時,可能出現如下問題:
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> father
原因是mac上不能根據父分支的分支名直接關聯到遠端同名分支上,遇到這個問題,執行:
git branch --set-upstream-to=origin/father father
之後就可以正常push和pull了