關於git
的介紹實在太多,Google 或 百度一下 就有,再也不介紹。 git
我的接觸 git
已經差很少三年,第一次使用git
做爲版本管理工具時,網上查查資料也能使用,但習慣了svn
的客戶端,感受學習git
的曲線很陡,不少命令老是很容易搞混或忘記,後來換工做又切回svn
了。直到最近加入新的team,徹底使用git
,通過不斷請教和學習,該把成果整理概括一下,以備從此查詢。github
我的認爲實際用到的很少,通常都是現有的代碼倉庫,直接克隆下來,裏面就有.git
目錄svn
git init # 生成 .git 目錄 git remote add origin git@github.com:my-name/proj.git # 本地和遠程倉庫關聯
git clone git@github.com:my-name/proj.git
提交以前,先看一下本次 修改、刪除、新增 了哪些文件工具
git status
git diff [/path/to/file] # 可指定文件,展現工做區和最新提交之間的差別,commit以前建議使用 git diff --stat # 展現工做區和最新提交之間的差別,只有文件名和行數 git diff HEAD # 比較本次提交和上次提交之間的差別,push以前建議使用 git diff 2265d4a86 4b94416057 # 比較兩個歷史版本之間的差別
提交倉庫的變動,新增和修改文件命令相同學習
git add /path/to/file1 [/path/to/file2...] # 提交到本地暫存區,可同時提交多個文件 git commit -m '提交文件' # 保存暫存區的變動到當前分支 git push origin branch-name # 把變動文件推到當前分支對應的遠程倉庫
提交全部文件,可使用測試
git add -A git commit -m '提交全部文件'
或簡寫爲fetch
git commit -am '簡寫:提交全部文件'
如提交以後,想修改最近一次提交信息,可以使用code
git commit --amend
git mv /path/to/old-file /path/to/new-file git commit -m '文件重命名' git push origin branch-name
git rm /path/to/file git commit -m '刪除文件' git push origin branch-name
log 會已提交時間由近及遠展現(不能看已刪除的 commit log)開發
git log # 展現提交的哈希值、合併信息、做者、提交時間和備註信息 git log /path/to/file # 展現指定文件/目錄提交的哈希值、合併信息、做者、提交時間和備註信息 git log --pretty=short # 展現提交的哈希值、合併信息、做者和備註信息的第一行 git log --pretty=online # 一行展現提交的哈希值、備註信息 git log --graph # 簡單圖形展現每次提交的分支及其分化衍合狀況 git log -p [/path/to/file] # -p 會展現先後差別 git log --stat # 展現每次提交新增或刪除的文件行數 git log --grep=test # 展現包含test關鍵字的提交 git log --author=myname # 展現做者是myname的提交
那麼,有時想查看包括已刪除在內的全部commit log,則使用rem
git reflog
git branch # 查看本地分支 git branch -r # 查看遠程分支 git branch -a # 查看全部分支
git branch new-branch-1 # 新建分支 git checkout new-branch-1 # 切換新分支 git checkout master # 切換回到master
可簡寫爲
git checkout -b new-branch-1
使用如下命令便可把本地分支推送到遠程
git push origin new-branch-1
git branch -m old-branch-name new-branch-name git branch -M old-branch-name new-branch-name # 如已存在則強行覆蓋
推送到遠程,
git push origin new-branch-name
此時,遠程同時存在兩個分支 old-branch-name
和 new-branch-name
git checkout master # 不能刪除當前所在分支 git branch -d old-branch-name # 刪除本地分支,若有未合併的代碼,將會刪除失敗 git branch -D old-branch-name # 強行刪除,即便有未合併的代碼 git push origin --delete old-branch-name # 刪除遠程分支 git push origin :old-branch-name # 把空推送到遠程,也至關於刪除遠程分支
在推送以前,首先要確保本地已經跟遠程倉庫關聯 倉庫初始化
,再推送
git push origin new-branch-1
建議本地和遠程分支的名稱保持一致
git checkout -b new-branch-2 origin/new-branch-2
將遠程分支的最新代碼同步到本地
git pull origin new-branch-2 # 會自動merge # 等同於以下命令,注意git pull 和 git fetch 的區別 git fetch origin git merge origin/new-branch-2
git checkout master git merge --no-ff new-branch-1 # --no-ff 會把本次合併記錄到歷史記錄中 git branch --merged # 查看已合併的分支 git branch --no-merged # 查看未合併的分支
當發生衝突時,打開衝突文件編輯,再參考 提交文件
提交便可
在提交到暫存區以前(即未 git add
),需撤銷某個文件的修改,則使用
git checkout -- filename
如已經提交到暫存區,但 未git commit
,則使用
git reset HEAD filename git checkout -- filename
如 已 git commit
,則使用
git revert HEAD
還有一種狀況,就是 恢復已刪除的文件
,則使用
rm filename # 發現誤刪了 git checkout -- filename # 便可恢復
--hard
表示完全回退
git reset --hard HEAD~1 # 本地回退到上一個歷史版本 git reset --hard 3b40bcb448c5b3 # 本地回到指定版本,能夠是當前版本以前或以後的某一個版本 git reset --hard origin/master # 本地版本回到跟遠程同樣 git push -f origin your-branch # 回滾後的代碼同步到遠程
git remote -v git remote show origin # 查看某個遠程倉庫的詳細信息
開發過程當中,不免遇到緊急插入的需求,不得不停下手頭去處理問題,這時候就須要保留現場(包括
暫存區和工做區的內容),可以使用以下命令
git stash # 對當前的暫存區和工做區狀態進行保存 git stash list # 查看保存的現場 git stash pop # 恢復保存的現場並刪除現場快照
一些文件不想提交,可配置爲忽略,在根目錄下的文件.gitignore
加入要忽略的文件和目錄便可。
在實際的使用過程當中,不少team 通常使用 Github、Gitlab、Bitbucket等進行管理。下面以 Github
爲例。
如今Github
上已有項目 test_proj
,地址爲 git@github.com:my-org/test_proj.git
項目名稱都是虛構
Github
上fork
這個項目,完成以後你的開發分支就變成git@github.com:your-name/test_proj.git
。
git clone git@github.com:your-name/test_proj.git # 克隆項目 cd test_proj/ git remote add upstream git@github.com:my-org/test_proj.git # 很關鍵,設置我的分支的源倉庫
基本操做命令
便可),都不會對源倉庫有影響。Pull Request
(簡稱PR
),就能夠等待項目的owner 進行代碼審查和合並了。fork
本身的分支,提PR
也有前後順序,也許咱們提PR
時,源倉庫的代碼已經通過了幾回迭代,那麼發生衝突的可能性就很是大。爲了儘量避免代碼衝突,設置我的分支的源倉庫
這個步驟就顯得很是關鍵了,咱們要在設置好源倉庫以後,在開發過程當中,常常同步源倉庫的代碼,使用以下命令便可:
git pull upstream master # 同步master的最新代碼到本地
目前團隊使用的這種模式,這也跟開源項目的模式是一致的,我我的也很是喜歡,省事!
以前使用 Git-flow
模式開發,每次開發都須要從master
新建分支,merge
以後再刪除分支,每次需求來了就反覆新建分支,刪除分支
,感受比較繁瑣。
學習git
確實曲線比svn
陡,查了很多資料,還專門買了兩本書來啃,花了大半個月,累死我了!
不過確實很是有收穫,也很是開心,週末沒出門,宅家裏兩天寫完這篇博客,算是一個小小的總結吧!^_^