git操做的學習
HEAD、master、branch總結
- HEAD 是指向當前 commit 的引用,它具備惟一性,每一個倉庫中只有一個 HEAD。在每次提交時它都會自動向前移動到最新的 commit 。
- branch 是一類引用。HEAD 除了直接指向 commit,也能夠經過指向某個 branch 來間接指向 commit。當 HEAD 指向一個 branch 時, commit 發生時,HEAD 會帶着它所指向的 branch 一塊兒移動。
-
master 是 Git 中的默認 branch,它和其它 branch 的區別在於:git
- 新建的倉庫中的第一個 commit 會被 master 自動指向;
- 在 git clone 時,會自動 checkout 出 master。
- 可使用git log這個指令查看當前上述三個的指向。
Git 的最基本的工做模型
簡單說明
- 從 GitHub 把中央倉庫 clone 到本地(使用命令: git clone)
-
把寫完的代碼提交(先用 git add 文件名 把文件添加到暫存區,再用 git commit交)算法
- 在這個過程當中,可使用 git status 來隨時查看工做目錄的狀態
- 每一個文件有 "changed / unstaged"(已修改), "staged"(已修改並暫存), "commited"(已提交) 三種狀態,以及一種特殊狀態"untracked"(未跟蹤)
- 提交一次或屢次以後,把本地提交 push 到中央倉庫(git push)
基本操做
- git clone '倉庫地址'
- git add 文件名
- git commit -m '介紹說明'
- git push -u origin branch_name
多人合做的基本工做模型
簡單說明
- 多人從Github吧中央倉庫clone到本身機器(本地)上(使用命令: git clone)
- 同事 commit 代碼到他的本地,並 push 到 GitHub 中央倉庫
-
你也能夠把本身的 commit 代碼到他的本地,並 push 到 GitHub 中央倉庫併發
- 若是你的同事比你先push到GitHub中央倉庫,也就是說GitHub中央倉庫有你本地倉庫沒有的commits,此時你須要先pull把遠端倉庫上的新內容取回到本地和本地合併,而後再把合併後的本地倉庫向遠端倉庫推送
- 若是 push 失敗,就用 pull 把本地倉庫的提交和中央倉庫的提交進行合併,而後再 push 一次
基本操做
-
同事一:學習
同事二:code
...開發
-
同事一:it
- git add 文件名
- git commit -m '介紹說明'
- git push -u origin branch_name
-
本身:ast
- git pull origin branch_name
- git add 文件名
- git commit -m '介紹說明'
- git push -u origin branch_name
合併commits
主要用到的操做是merge引用
- merge含義:指定一個 commit,把它合併到當前的 commit 來。
-
使用場景:總結
- HEAD 領先於目標 commit:
若是 merge 時的目標 commit 和 HEAD 處的 commit 並不存在分叉,而是 HEAD 領先於目標 commit,那麼 merge 就不必再建立一個新的 commit 來進行合併操做,由於並無什麼須要合併的。在這種狀況下, Git 什麼也不會作,merge 是一個空操做。
- HEAD 落後於 目標 commit——fast-forward:
若是 HEAD 和目標 commit 依然是不存在分叉,但 HEAD 不是領先於目標 commit,而是落後於目標 commit,Git 會直接把 HEAD(以及它所指向的 branch,若是有的話)移動到目標 commit:git merge feature1
- HEAD 與目標 commit(branch1)存在分叉:
從目標 commit 和當前 commit (即 HEAD 所指向的 commit)分叉的位置起,把目標 commit 的路徑上的全部 commit 的內容一併應用到當前 commit,而後自動生成一個新的 commit。git merge branch1
常見問題
-
push衝突
- 場景描述:在團隊開發過程當中,多人併發工做,你的同事有可能先你push本身的commit到Github中央倉庫,致使中央倉庫獲得了更新,這樣使得中央倉庫包含了本身本地倉庫沒有的內容,這時候你再push,push會被拒絕。
- 解決方案:
先用 pull 把遠端倉庫上的新內容取回到本地和本地合併,而後再把合併後的本地倉庫向遠端倉庫推送。
-
基本操做:
- git pull origin branch_name
- git add 文件名
- git commit -m '內容說明'
- git push -u origin branch_name
-
merge衝突
- 場景描述:merge 在作合併的時候,是有必定的自動合併能力的:若是一個分支改了 A 文件,另外一個分支改了 B 文件,那麼合併後就是既改 A 也改 B,這個動做會自動完成;若是兩個分支都改了同一個文件,但一個改的是第 1 行,另外一個改的是第 2 行,那麼合併後就是第 1 行和第 2 行都改,也是自動完成。可是,若是兩個分支修改了同一部份內容,merge 的自動算法就搞不定了。這種狀況 Git 稱之爲:衝突。
-
解決方案:
1. 解決掉衝突:當使用了git merge branch1時,git會把兩個文件衝突的內容放在一塊兒,並使用相關符號區分開來,而後須要的自行判斷咱們選擇保留哪一個分支上的修改或者再次自行修改內容,保存文件。
2. 手動提交,按照正常的提交操做提交。
-
基本操做:
1. git merge branch1
2. 修改衝突文件內容,保存文件
3. git add 文件名
4. git commit -m '內容說明'
5. git push -u origin branch_name
基本指令
- git log 查看歷史提交記錄 鍵盤英文狀態下按字母q,退出git log
- git status 隨時查看工做目錄的狀態
- git clone '地址' 下拉到本地
- git add 文件名 把文件添加到暫存區
- git commit -m 'xxx' 提交
- git push -u origin brnach_name 提交到中央倉庫
- git branch 查看全部分支
- git branch branch_name 建立分支branch_name
- git checkout branch_name 切換分支
- git checkout -b branch_name 建立分支並自動切換到該分支上
- git branch -d branch_name 刪除分支(須要合併分支的指令)
- git brnach -D branch_name 刪除分支(無需合併分支的指令)
- git merge branch_name 合併分支