
程序猿工作中接觸到的 Git 命令其實(shí)不是很多,常用的就那些。有時(shí)候遇到一些小功能,就上網(wǎng)查一下,本文就針對(duì)用到的一些小知識(shí)點(diǎn)做個(gè)總結(jié)。
需要先在 Github 上創(chuàng)建個(gè)屬于你的倉(cāng)庫(kù),本文倉(cāng)庫(kù)名以 michalel-git 為例。
地址為: git@github.com:Michael728/michael-git.git
Git 安裝
Windows安裝時(shí)需要注意在Configuring the line ending conversions界面,選擇Checkout as-is,commit as -s,避免Windows的換行符問題。如果忘記設(shè)置,可以使用如下命令后期設(shè)置:
git config --global core.autocrlf false
參考:
Git 配置
可以通過 git config -l 查看配置。
設(shè)置 Git 賬號(hào)
git config --global user.name "michael728"
git config --global user.email "649168982@qq.com"
Git 配置別名
git config文件來(lái)輕松為每一個(gè)命令設(shè)置別名。例如:
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
如果你想要執(zhí)行外包命令,而不是一個(gè) Git 子命令,可以在命令前面加 ! 符號(hào)。
演示將git visual定義為gitk的別名:
git config --global alias.visual '!gitk'
設(shè)置命令的別名,可以提高操作效率。查看.gitconfig文件cat ~/.gitconfig:
[user]
name = xxx
email = xxx
[i18n]
commitencoding = utf-8
logoutputencoding = utf-8
[core]
quotepath = false
[filter "lfs"]
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
process = git-lfs filter-process
required = true
[alias]
co = checkout
br = branch
c = commit
s = status
unstage = reset HEAD --
last = log -1 HEAD
lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
[color]
ui = true
我們可以體驗(yàn)一個(gè)log的別名命令設(shè)置:
lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
這是超厲害的別名縮寫命令,試試現(xiàn)在的 git lg 有多酷炫吧!
Git 幫助文檔
授人以魚不如授人以漁,先知道怎么通過幫助文檔查看常用命令的說明吧:
git help
git help <cmd>
創(chuàng)建 Git 本地倉(cāng)庫(kù)
已有遠(yuǎn)端倉(cāng)庫(kù),創(chuàng)建本地倉(cāng)庫(kù)
git clone git@github.com:Michael728/michael-git.git
cd michael-git
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
已存在文件夾
cd micahel-git
git init
git remote add origin git@github.com:Michael728/michael-git.git
git add .
git commit
git push -u origin master
已存在 Git 倉(cāng)庫(kù)
cd existing_repo
git remote add origin git@github.com:Michael728/michael-git.git
git push -u origin --all # --all 表示 Push all branches,-u 選項(xiàng)指定了一個(gè)默認(rèn)主機(jī)
git push -u origin --tags # --tags All refs under refs/tags are pushed
將本地的master分支推送到origin主機(jī),同時(shí)指定origin為默認(rèn)主機(jī),后面就可以不加任何參數(shù)使用git push了。
參考:
git clone
git clone [-b br_name] url git@github.com:Michael728/michael-git.git
克隆的時(shí)候,可以指定下載遠(yuǎn)端的分支、自定義本地倉(cāng)庫(kù)的名字。如果不加分支名參數(shù),git clone 命令會(huì)默認(rèn)自動(dòng)設(shè)置本地 master 分支跟蹤克隆的遠(yuǎn)程倉(cāng)庫(kù)的 master 分支(其實(shí)是倉(cāng)庫(kù)的默認(rèn)分支)。而且,默認(rèn)遠(yuǎn)程倉(cāng)庫(kù)設(shè)置別名為 origin。
git add
這是個(gè)多功能命令:
- 可以用它開始跟蹤新文件
- 把已跟蹤的文件放到暫存區(qū)
- 還能用于合并時(shí)把有沖突的文件標(biāo)記為已解決狀態(tài),這個(gè)是在解決沖突時(shí)會(huì)用到的功能
git commit
提交的操作,當(dāng)你前面采用add命令將文件添加到暫存區(qū)跟蹤后,需要通過commit將暫存區(qū)的內(nèi)容提交到當(dāng)前分支。
git commit -m "test"
當(dāng)一些已追蹤的文件修改了,常常需要git add file,然后在git commit -m "xxxx",其實(shí)這兩個(gè)步驟可以合二為一:
git commit -am "test"
這么寫個(gè)人覺得挺好,可以有效避免有些懶人git add .的方式,將一切文件都添加到了暫存區(qū),導(dǎo)致最后多余文件提交入庫(kù)。
git push
語(yǔ)法:
git push <遠(yuǎn)程主機(jī)名> <本地分支名>:<遠(yuǎn)程分支名>
如果省略遠(yuǎn)程分支名,則表示將本地分支推送與之存在"追蹤關(guān)系"的遠(yuǎn)程分支(通常兩者同名),如果該遠(yuǎn)程分支不存在,則會(huì)被新建。
當(dāng)想要將master分支推送到origin服務(wù)器上:
git push origin master
將本地分支test推送到遠(yuǎn)端時(shí)可以重命名:
git push origin test:remote-test
利用該用法,還可以推送空分支到遠(yuǎn)端,實(shí)現(xiàn)遠(yuǎn)端分支的刪除:
git push origin :remote-test
# 和如下命令等同
git push origin --delete remote-test
git rm
從 Git 中移除某個(gè)文件,就必須從已跟蹤的文件清單中刪除(從暫存區(qū)域移除文件),然后提交??梢允褂?code>git rm命令完成此項(xiàng)工作,并連帶從工作目錄中刪除指定的文件。
當(dāng)我們先把某文件從 Git 庫(kù)中刪除(亦即從暫存區(qū)移除),但仍然希望保留在當(dāng)前工作目錄中。比如當(dāng)你忘記在.gitignore文件中將一些文件忽略,但是卻不小心把大的日志文件添加到暫存區(qū)域時(shí),這一做法很有用:
# --cached 將 README 文件從暫存區(qū)移除,但是工作區(qū)目錄仍然保留
git rm --cached README
git checkout
切換到某個(gè)歷史版本:
git checkout <commit id>
在 Git 中從當(dāng)前分支創(chuàng)建并檢出新分支的命令是:
git checkout -b new-br
這個(gè)命令實(shí)際是:
git checkout -b new-br current-br
在本地創(chuàng)建并切換到遠(yuǎn)端的分支:
git branch -va # 查看本地+遠(yuǎn)程分支列表
git checkout -b dev origin/dev
還可以可以在checkout命令中使用Hash值作為起點(diǎn)創(chuàng)建分支:
git checkout -b name-of-branch <commit id>
除了有“切換”的意思,checkout還有一個(gè)撤銷的作用。
舉個(gè)例子,假設(shè)我們?cè)谝粋€(gè)分支開發(fā)一個(gè)小功能,剛寫完一半,這時(shí)候需求變了,而且是大變化,之前寫的代碼完全用不了,好在你剛寫,甚至都沒有 git add 進(jìn)暫存區(qū),這個(gè)時(shí)候很簡(jiǎn)單的一個(gè)操作就直接把原文件還原:
git checkout <filename>
git log
git log --pretty=oneline # 檢查提交日志,都在一行:<commit id> <message>
查看某人的提交:
git log --author=michael
一個(gè)常用的選項(xiàng)是-p,用來(lái)顯示每次提交的內(nèi)容差異,也可以加上-2或者-n2來(lái)僅顯示最近兩次提交:
git log -p -2
git log -n1 --format=format:%h # 查看當(dāng)前分支最新的 commit id 縮略值
列出最近兩周內(nèi)的提交:
git log --since=2.weeks
git diff
git diff本身只顯示尚未暫存的改動(dòng),而不是自上次提交以來(lái)所做的所有改動(dòng)。
若要查看已暫存的將要添加到下次提交里的內(nèi)容和上次提交的內(nèi)容的變化,可以用git diff --staged
git branch
新建develop分支:
git branch develop
切換分支:
復(fù)習(xí)一下checkout的用法
git checkout develop
新建并切換到develop分支:
git checkout -b develop
將分支develop推送到遠(yuǎn)程倉(cāng)庫(kù)origin:
git push origin develop
如果想給遠(yuǎn)程的分支取名為develop2,可以:
git push origin develop:develop2
不建議這么操作易混亂,還是本地分支名和遠(yuǎn)程分支名保持一致比較好。
關(guān)聯(lián)本地分支和遠(yuǎn)程分支:
創(chuàng)建本地分支并切換到分支:git checkout -b tools-dev
創(chuàng)建遠(yuǎn)程分支:git push origin tools-dev
本地分支推送到遠(yuǎn)程服務(wù)器時(shí),遠(yuǎn)程分支自動(dòng)創(chuàng)建,推送本地分支到遠(yuǎn)程:
git push --set-upstream <remote-name> <local-branch-name>:<remote-branch-name>
-
<remote-name>:遠(yuǎn)程 Git 服務(wù)器名稱,一般為origin -
<local-branch-name>:本地分支名稱 -
<remote-branch-name>:遠(yuǎn)程分支名稱
一般情況下,本地分支和遠(yuǎn)程分支名稱相同,所以可簡(jiǎn)化為:
git push --set-upstream <remote-name> <branch-name>
--set-upstream參數(shù)用來(lái)關(guān)聯(lián)本地分支和遠(yuǎn)程分支
參考:
查看本地分支:
git branch
查看遠(yuǎn)程分支:
git branch -r
刪除本地分支:
git branch -d develop
git branch -D develop(強(qiáng)制刪除)
刪除遠(yuǎn)程分支:
git push origin :remote-test
# 和如下命令等同
git push origin --delete remote-test
撤銷操作
git commit --amend
如果已經(jīng)提交完了(已經(jīng)commit)了,發(fā)現(xiàn)漏掉幾個(gè)文件沒有添加,或者提交信息(-m)寫錯(cuò)了,可以運(yùn)行帶有--amend選項(xiàng)的提交命令重新提交。
這個(gè)命令會(huì)將暫存區(qū)的文件提交。文本編輯器編輯后,會(huì)覆蓋原來(lái)的提交信息。
取消暫存文件
git reset HEAD <file>
撤銷對(duì)文件的修改
git checkout -- <file>
你需要知道
git checkout -- [file]是一個(gè)危險(xiǎn)的命令,這很重要.
遠(yuǎn)程倉(cāng)庫(kù)的使用
查看遠(yuǎn)程倉(cāng)庫(kù)
git remote -v
如果想查看遠(yuǎn)程倉(cāng)庫(kù)更多的信息,可以使用git remote show <remote-name>命令。
遠(yuǎn)程倉(cāng)庫(kù)的移除與重命名
git remote rename <old-remote-name> <new-remote-name>
git remote rename pb paul
如果因?yàn)橐恍┰蛞瞥粋€(gè)遠(yuǎn)程倉(cāng)庫(kù),可以使用git remote rm <remote-name>。
添加一個(gè)新的遠(yuǎn)程 Git 倉(cāng)庫(kù),同時(shí)指定一個(gè)可以輕松引用的簡(jiǎn)寫:
git remote add <remote-name> <url>
這里的remote-name常常取名為origin。所以,常見的origin其實(shí)是一個(gè)你 Git 倉(cāng)庫(kù)跟蹤的遠(yuǎn)程倉(cāng)庫(kù)的簡(jiǎn)寫。
拉取遠(yuǎn)端倉(cāng)庫(kù)有但你本地沒有的信息:
git fetch <remote-name>
如果你使用clone命令克隆了一個(gè)倉(cāng)庫(kù),命令會(huì)自動(dòng)將其添加為遠(yuǎn)程倉(cāng)庫(kù)并默認(rèn)以origin為縮寫。
Tag
列出標(biāo)簽
git tag # 列出所有標(biāo)簽
git tag -l 'v1.8*' # 列出以 v1.8 開頭的所有標(biāo)簽
創(chuàng)建標(biāo)簽
Git使用兩種主要類型的標(biāo)簽:
- 附注(annotated)標(biāo)簽
- 輕量(ightweight)標(biāo)簽
前者會(huì)包括一些注釋信息,來(lái)進(jìn)一步解釋這個(gè) tag 的作用,而后者就僅僅只是一個(gè) tag 的名字
附注標(biāo)簽
git tag -a v1.4 -m 'my version 1.4'
通過git show <tag-name>命令可以看到標(biāo)簽信息
輕量標(biāo)簽
git tag v1.4
沒用-a、-m的參數(shù),只需要提供標(biāo)簽名字
刪除標(biāo)簽
git tag -d <tagname>
補(bǔ)打標(biāo)簽
假設(shè)忘記給項(xiàng)目打標(biāo)簽,可以在之后加上:
基于某歷史節(jié)點(diǎn)的commit id補(bǔ)打Tag:
git tag -a v1.2 <commit id>
共享標(biāo)簽
默認(rèn)情況下,git push命令并不會(huì)傳送標(biāo)簽到遠(yuǎn)程服務(wù)器上。在創(chuàng)建完標(biāo)簽后你必須顯示地推送標(biāo)簽到共享服務(wù)器上。這個(gè)過程就像共享遠(yuǎn)程分支一樣,可以運(yùn)行git push origin [tagname]
如果想要一次性推送很多標(biāo)簽,也可以使用--tags選項(xiàng)的git push:
git push origin --tags
檢出標(biāo)簽
git checkout -b <new-br> <tagname>
參考:
使用場(chǎng)景
新特性開發(fā),創(chuàng)建臨時(shí)分支,再合并到主干
#創(chuàng)建特性分支
git checkout -b featureA
……
#提交之前,先checkout到master分支,更新一下
git co master
git pull
#切到特性分支,在本地與最新的master分支合并
git co featureA
git rebase -i master
參考:
本地倉(cāng)庫(kù)關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù):
已有本地倉(cāng)庫(kù),需要關(guān)聯(lián)遠(yuǎn)端倉(cāng)庫(kù),分兩步:
第一步,在Github上新建一個(gè)倉(cāng)庫(kù)test;
第二步:將本地倉(cāng)庫(kù)與Github上的test項(xiàng)目進(jìn)行關(guān)聯(lián),切換到本地倉(cāng)庫(kù)目錄:
git remote add origin git@github.com:xx/test.git
什么意思?遠(yuǎn)程倉(cāng)庫(kù)的地址為:git@github.com:xx/test.git,而origin是給這項(xiàng)目的遠(yuǎn)程倉(cāng)庫(kù)起的名字,是的,名字你可以隨便取,只不過大家公認(rèn)的只有一個(gè)遠(yuǎn)程倉(cāng)庫(kù)時(shí)名字就是origin,為什么要給遠(yuǎn)程倉(cāng)庫(kù)取名字?因?yàn)槲覀兛赡芤粋€(gè)項(xiàng)目有多個(gè)遠(yuǎn)程倉(cāng)庫(kù),比如,Github一個(gè),比如公司一個(gè),這樣的話,提交的時(shí)候可以提交到不同的遠(yuǎn)程倉(cāng)庫(kù)就需要指定不同的倉(cāng)庫(kù)名字了。
查看我們當(dāng)前項(xiàng)目有哪些遠(yuǎn)程倉(cāng)庫(kù)可以執(zhí)行如下命令:
git remote -v
接下來(lái),本地的倉(cāng)庫(kù)可以向遠(yuǎn)程倉(cāng)庫(kù)進(jìn)行代碼提交了:
git push origin master
在代碼提交之前,西安設(shè)置自己的用戶名和郵箱,這些信息會(huì)出現(xiàn)在所有的commit記錄里:
git config --global user.name "xxx"
git config --global user.email "xx@mail.com"
二分查找,傻瓜式定位bug
場(chǎng)景:定位Bug,當(dāng)前版本有Bug,上個(gè)版本沒有,兩個(gè)版本之前有上千次commit
二分查找,N個(gè)patch只需要測(cè)試log2N次(8k個(gè)path僅需測(cè)試13次)
可以實(shí)現(xiàn)測(cè)試自動(dòng)化,自動(dòng)查找問題patch
git bisect:自動(dòng)定位,不必找原作者
同時(shí)負(fù)責(zé)多個(gè)Bug的修改
- 更新遠(yuǎn)程倉(cāng)庫(kù)代碼
git fetch
- 以origin/master為基礎(chǔ)創(chuàng)建分支
git checkout -b fix/bug23 origin/master
- 修改完
git commit
- 推送前更新一下代碼,看看別人是否有修改
git fetch
- 有修改的話rebase一下
git rebase origin/master
- 生成patch
git format-patch origin/master
- 發(fā)送patch或者也可以使用request pull
send email OR Request pull
[maintainer接收后]
- 分支使用已經(jīng)完成,可以刪除了
git branch -D fix/bug23
想知道某行代碼誰(shuí)修改的
閱讀代碼時(shí),想知道某行代碼是誰(shuí)修改的?
- 找到對(duì)應(yīng)commit id
git blame src/xxx.c
- 查看具體提交的內(nèi)容
git show <commit id>
遠(yuǎn)端倉(cāng)庫(kù)會(huì)退到歷史版本
- 查找commit id
通過git log查找想要會(huì)退到的歷史版本的commit id - 本地執(zhí)行回退
git reset --hard [commit id]
- 強(qiáng)制推送
git push -f
參考:git 遠(yuǎn)程倉(cāng)庫(kù)版本的回退以及git reset 幾種常用方式記錄
突然插入bugifx,回退工作目錄
git stash保存所有工作內(nèi)容
cherry-pick
將某一提交點(diǎn)的修改拿到當(dāng)前分支上:
git cherry-pick 哈希值
基本的團(tuán)隊(duì)協(xié)作流程
多人協(xié)作下的分支管理規(guī)范很重要,就跟代碼規(guī)范一樣重要。
以下就跟大家推薦一種我們內(nèi)部在使用的一種分支管理流程 Git Flow。
Gti Flow
Git Flow 是一種比較成熟的分支管理流程,我們先看一張圖能清晰的描述他整個(gè)的工作流程:
大部分情況下都會(huì)擁有兩個(gè)分支 master 和 develop,他們的職責(zé)分別是:
- master:永遠(yuǎn)處在即將發(fā)布(production-ready)狀態(tài)
- develop:最新的開發(fā)狀態(tài)
確切的說 master、develop 分支大部分情況下都會(huì)保持一致,只有在上線前的測(cè)試階段
develop 比 master 的代碼要多,一旦測(cè)試沒問題,準(zhǔn)備發(fā)布了,這時(shí)候會(huì)將 develop 合并到
master 上。
但是,我們發(fā)布之后又會(huì)進(jìn)行下一版本的功能開發(fā),開發(fā)中間可能又會(huì)遇到需要緊急修復(fù) bug
,一個(gè)功能開發(fā)完成之后突然需求變動(dòng)了等情況,所以 Git Flow 除了以上 master 和 develop
兩個(gè)主要分支以外,還提出了以下三個(gè)輔助分支:
- feature: 開發(fā)新功能的分支, 基于 develop, 完成后 merge 回 develop
- release: 準(zhǔn)備要發(fā)布版本的分支, 用來(lái)修復(fù) bug,基于 develop,完成后 merge 回develop 和 master
- hotfix: 修復(fù) master 上的問題, 等不及 release 版本就必須馬上上線. 基于 master, 完成后merge 回 master 和 develop
什么意思呢?
舉個(gè)例子,假設(shè)我們已經(jīng)有 master 和 develop 兩個(gè)分支了,這個(gè)時(shí)候我們準(zhǔn)備做一個(gè)功能A,第一步我們要做的,就是基于 develop 分支新建個(gè)分支:
git branch feature/A
看到了吧,其實(shí)就是一個(gè)規(guī)范,規(guī)定了所有開發(fā)的功能分支都以 feature 為前綴。但是這個(gè)時(shí)候做著做著發(fā)現(xiàn)線上有一個(gè)緊急的 bug 需要修復(fù),那趕緊停下手頭的工作,立刻切換到 master 分支,然后再此基礎(chǔ)上新建一個(gè)分支:
git branch hotfix/B
代表新建了一個(gè)緊急修復(fù)分支,修復(fù)完成之后直接合并到 develop 和 master ,然后發(fā)布。然后再切回我們的 feature/A 分支繼續(xù)著我們的開發(fā),如果開發(fā)完了,那么合并回 develop 分支,然后在 develop 分支屬于測(cè)試環(huán)境,跟后端對(duì)接并且測(cè)試的差不多了,感覺可以發(fā)布到正式環(huán)境了,這個(gè)時(shí)候再新建一個(gè) release 分支:
git branch release/1.0
這個(gè)時(shí)候所有的 api、數(shù)據(jù)等都是正式環(huán)境,然后在這個(gè)分支上進(jìn)行最后的測(cè)試,發(fā)現(xiàn) bug 直接進(jìn)行修改,直到測(cè)試 ok 達(dá)到了發(fā)布的標(biāo)準(zhǔn),最后把該分支合并到 develop 和 master 然后進(jìn)行發(fā)布。
以上就是 Git Flow 的概念與大概流程,看起來(lái)很復(fù)雜,但是對(duì)于人數(shù)比較多的團(tuán)隊(duì)協(xié)作現(xiàn)實(shí)開發(fā)中確實(shí)會(huì)遇到這么復(fù)雜的情況,是目前很流行的一套分支管理流程,但是有人會(huì)問每次都要各種操作,合并來(lái)合并去,有點(diǎn)麻煩,哈哈,這點(diǎn) Git Flow 早就想到了,為此還專門推出了一個(gè) Git Flow 的工具,并且是開源的:
GitHub 開源地址: https://github.com/nvie/gitflow
簡(jiǎn)單點(diǎn)來(lái)說,就是這個(gè)工具幫我們省下了很多步驟,比如我們當(dāng)前處于 master 分支,如果想要開發(fā)一個(gè)新的功能,第一步切換到 develop 分支,第二步新建一個(gè)以 feature 開頭的分支名,有了 Git Flow 直接如下操作完成了:
git flow feature start A
這個(gè)分支完成之后,需要合并到 develop 分支,然而直接進(jìn)行如下操作就行:
git flow feature finish A
如果是 hotfix 或者 release 分支甚至?xí)詣?dòng)幫你合并到 develop、master 兩個(gè)分支。
想必大家已經(jīng)了解了這個(gè)工具的具體作用,具體安裝與用法我就不多提了,感興趣的可以看
我下我之前寫過的一篇博客: http://stormzhang.com/git/2014/01/29/git-flow/
詳細(xì)演示下怎么給一個(gè)項(xiàng)目發(fā)起 Pull Request(PR):
- 第一步,找到你想發(fā)起 PR 的項(xiàng)目,點(diǎn)擊右上角的 Fork 按鈕,然后該項(xiàng)目就出現(xiàn)在了你自己賬號(hào)的 Repository 里。
- 第二步,把fork的項(xiàng)目 clone 到本地,然后修改的 bug 也好,想要新增的功能也好,總之把自己做的代碼改動(dòng)開發(fā)完,接著,把自己做的代碼改動(dòng) push 到 你自己的 GitHub 上去。
- 第三步,點(diǎn)擊你 Fork 過來(lái)的項(xiàng)目主頁(yè)的 Pull requests 頁(yè)面,點(diǎn)擊右上角的New pull request。
頁(yè)面自動(dòng)會(huì)比較該項(xiàng)目與原有項(xiàng)目的不同之處,最頂部聲明了是源倉(cāng)庫(kù)的分支與你fork過來(lái)的分支的對(duì)比。同樣的我寫好標(biāo)題和描述,然后我們點(diǎn)擊中間的 Create pull request 按鈕,至此我們就成功給該項(xiàng)目提交了一個(gè) PR。
然后就等著項(xiàng)目原作者 review 你的代碼,并且決定會(huì)不會(huì)接受你的 PR,如果接受,那么恭喜你,你已經(jīng)是該項(xiàng)目的貢獻(xiàn)者之一了。
Git FAQ
git merge和git rebase的區(qū)別
git checkout master
git merge featureA
其實(shí) rebase 命令也是合并的意思,上面的需求我們一樣可以如下操作:
git checkout master
git rebase featureA
rebase 跟 merge 的區(qū)別你們可以理解成有兩個(gè)書架,你需要把兩個(gè)書架的書整理到一起去,第一種做法是 merge ,比較粗魯暴力,就直接騰出一塊地方把另一個(gè)書架的書全部放進(jìn)去,雖然暴力,但是這種做法你可以知道哪些書是來(lái)自另一個(gè)書架的;第二種做法就是rebase ,他會(huì)把兩個(gè)書架的書先進(jìn)行比較,按照購(gòu)書的時(shí)間來(lái)給他重新排序,然后重新放置好,這樣做的好處就是合并之后的書架看起來(lái)很有邏輯,但是你很難清晰的知道哪些書來(lái)自哪個(gè)書架的。
只能說各有好處的,不同的團(tuán)隊(duì)根據(jù)不同的需要以及不同的習(xí)慣來(lái)選擇就好。
rebase 和 merge的另一個(gè)區(qū)別是rebase 的沖突是一個(gè)一個(gè)解決,如果有十個(gè)沖突,先解決第一個(gè),然后用命令
git add -u
git rebase --continue
繼續(xù)后才會(huì)出現(xiàn)第二個(gè)沖突,直到所有沖突解決完,而merge 是所有的沖突都會(huì)顯示出來(lái)。
另外如果rebase過程中,你想中途退出,恢復(fù)rebase前的代碼則可以用命令
git rebase --abort
關(guān)于git rebase還有很多知識(shí)點(diǎn):
- 聊下git rebase -i
- git merge 和 git rebase 小結(jié)
- Git Community Book 中文版-rebase
- 壓縮多個(gè)Commit
- 合并多個(gè) Commit
git branch -r與git branch -a的區(qū)別?
-
git branch -r只顯示遠(yuǎn)端分支, -
git branch -a顯示本地分支和遠(yuǎn)程分支
發(fā)現(xiàn)好用的開源項(xiàng)目-Github
GitHub 其中一個(gè)最重要的作用就是發(fā)現(xiàn)全世界最優(yōu)秀的開源項(xiàng)目,你沒事的時(shí)候刷刷微博、知乎,人家沒事的時(shí)候刷刷 GitHub ,看看最近有哪些流行的項(xiàng)目,久而久之,這差距就越來(lái)越大,那么如何發(fā)現(xiàn)優(yōu)秀的開源項(xiàng)目呢?
- 關(guān)注一些活躍的大牛
- Explore菜單下的Trending,看到最近的一些熱門開源項(xiàng)目,很多人主動(dòng)獲取開源項(xiàng)目的最好的途徑,可以選擇“當(dāng)天熱門”,“一周之內(nèi)熱門”和“一月之內(nèi)熱門”來(lái)查看,并且,可以分語(yǔ)言來(lái)查看。
- Search,按照Most Stars來(lái)篩選。
除此之外,GitHub 的 Search 還有一些小技巧,比如你想搜索的結(jié)果中 star 數(shù)大于1000的,那么可以這樣搜索:
android http stars:>1000
有些人如果習(xí)慣用 Google 進(jìn)行搜索,那么想搜索 GitHub 上的結(jié)果,不妨前面加 GitHub 關(guān)鍵字就ok了,比如我在 google 里輸入 GitHub android http ,每個(gè)關(guān)鍵字用空格隔開。
福利大放送
GitHub 上影響力很大,同時(shí)又對(duì)你們很有用的項(xiàng)目:
- free-programming-books: 這個(gè)項(xiàng)目整理了所有跟編程相關(guān)的免費(fèi)書籍,而且全球多國(guó)語(yǔ)言版的都有,中文版的在這里 free-programming-books-zh
- ob-my-zsh: 俗話說,不會(huì)用 shell 的程序員不是真正的程序員,所以建議每個(gè)程序員都懂點(diǎn) shell,有用 不說,裝逼利器??!而 oh-my-zsh 毫無(wú)疑問就是目前最流行,最酷炫的 shell,不多說了,懂 得自然懂,不懂的以后你們會(huì)懂的!
- awesome: GitHub 上有各種 awesome 系列,簡(jiǎn)單來(lái)說就是這個(gè)系列搜羅整理了 GitHub 上各領(lǐng)域的資源大匯總,比如有 awesome-android, awesome-ios, awesome-java, awesome-python 等等等,就不截圖了,你們自行去感受。
- github-cheat-sheet: GitHub 的使用有各種技巧,只不過基本的就夠我們用了,但是如果你對(duì) GitHub 超級(jí)感興趣,想更多的了解 GitHub 的使用技巧,那么這個(gè)項(xiàng)目就剛好是你需要的,每個(gè) GitHub 粉都應(yīng)該知道這個(gè)項(xiàng)目。
- LearningNotes: https://github.com/francistao/LearningNotes
這是一份非常詳細(xì)的面試資料,涉及 Android、Java、設(shè)計(jì)模式、算法等等等,你能想到的,你不能想到的基本都包含了,可以說是適應(yīng)于任何準(zhǔn)備面試的 Android 開發(fā)者,看完這個(gè)之后別說你還不知道怎么面試!
GitHub 上優(yōu)秀開源項(xiàng)目真的是一大堆,就不一一推薦了,授人以魚不如授人以漁,請(qǐng)大家自行主動(dòng)發(fā)掘自己需要的開源項(xiàng)目吧,不管是應(yīng)用在實(shí)際項(xiàng)目上,還是對(duì)源碼的學(xué)習(xí),都是提升自己工作效率與技能的很重要的一個(gè)渠道,總有一天,你會(huì)突然意識(shí)到,原來(lái)不知不覺你已經(jīng)走了這么遠(yuǎn)!