Git 使用笔记
關于git的介紹實在太多,Google 或 百度一下 就有,不再介紹。
個人接觸 git 已經差不多三年,第一次使用git作為版本管理工具時,網上查查資料也能使用,但習慣了svn的客戶端,感覺學習git的曲線很陡,很多命令總是很容易搞混或忘記,后來換工作又切回svn了。直到最近加入新的team,完全使用git,經過不斷請教和學習,該把成果整理歸納一下,以備今后查詢。
基本操作命令
倉庫初始化
個人認為實際用到的不多,一般都是現有的代碼倉庫,直接克隆下來,里面就有.git 目錄
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 '提交所有文件'或簡寫為
git commit -am '簡寫:提交所有文件'如提交之后,想修改最近一次提交信息,可使用
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,則使用
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 # 查看某個遠程倉庫的詳細信息暫存變更信息
開發過程中,難免遇到緊急插入的需求,不得不停下手頭去處理問題,這時候就需要保留現場(包括
暫存區和工作區的內容),可使用如下命令
忽略文件和目錄
一些文件不想提交,可配置為忽略,在根目錄下的文件.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。
- 將自己的開發分支克隆到本地
- 在本地開發,期間的新增、修改、刪除源文件以及提交等操作(參考基本操作命令即可),都不會對源倉庫有影響。
- 開發完成并通過測試之后,代碼需合入源倉庫,提個 Pull Request(簡稱PR),就可以等待項目的owner 進行代碼審查和合并了。
- 需要注意的是,實際開發過程中,很可能是多人協作,每個人都fork自己的分支,提PR也有先后順序,也許我們提PR時,源倉庫的代碼已經經過了幾次迭代,那么發生沖突的可能性就非常大。
為了盡可能避免代碼沖突,設置個人分支的源倉庫 這個步驟就顯得非常關鍵了,我們要在設置好源倉庫之后,在開發過程中,經常同步源倉庫的代碼,使用如下命令即可:
git pull upstream master # 同步master的最新代碼到本地目前團隊使用的這種模式,這也跟開源項目的模式是一致的,我個人也非常喜歡,省事!
之前使用 Git-flow模式開發,每次開發都需要從master新建分支,merge 之后再刪除分支,每次需求來了就反復新建分支,刪除分支,感覺比較繁瑣。
學習git 確實曲線比svn陡,查了不少資料,還專門買了兩本書來啃,花了大半個月,累死我了!
不過確實非常有收獲,也非常開心,周末沒出門,宅家里兩天寫完這篇博客,算是一個小小的總結吧!^_^
參考文獻
總結
- 上一篇: 右键想要创建的文件
- 下一篇: Java获取正在执行的函数名