Git學(xué)習(xí)最全總結(jié)

image

程序猿工作中接觸到的 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 安裝

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中checkout歷史版本

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 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)目呢?

  1. 關(guān)注一些活躍的大牛
  2. Explore菜單下的Trending,看到最近的一些熱門開源項(xiàng)目,很多人主動(dòng)獲取開源項(xiàng)目的最好的途徑,可以選擇“當(dāng)天熱門”,“一周之內(nèi)熱門”和“一月之內(nèi)熱門”來(lái)查看,并且,可以分語(yǔ)言來(lái)查看。
  3. 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)!

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容