聊聊Gitlab中怎么優(yōu)雅的拉取和合并代碼

gitlab中怎么優(yōu)雅的拉取和合并代碼?下面本篇文章給大家介紹一下gitlab中拉取和合并代碼的方法,希望對(duì)大家有所幫助!

聊聊Gitlab中怎么優(yōu)雅的拉取和合并代碼

pull or fetch

拉取代碼的操作有兩種形式,git pull和git fetch,那么這兩種有什么區(qū)別呢?

讓我們先來(lái)看看一個(gè)架構(gòu)

聊聊Gitlab中怎么優(yōu)雅的拉取和合并代碼

圖中展示一個(gè)完整的git流程,為了更清晰的了解每個(gè)區(qū)域,我們下來(lái)解釋一下他們的功能:

  • 工作區(qū)(working Directory), 簡(jiǎn)言之就是你工作的區(qū)域。對(duì)于git而言,就是的本地工作目錄。
  • 暫存區(qū)(stage area, 又稱為索引區(qū)index), 是把修改提交版本庫(kù)前的一個(gè)過(guò)渡階段。在工作目錄下.git的目錄里面有個(gè)index文件,存儲(chǔ)著關(guān)于暫存區(qū)的內(nèi)容。git add命令將工作區(qū)內(nèi)容添加到暫存區(qū)。
  • 本地倉(cāng)庫(kù)(local repository), 版本控制系統(tǒng)的倉(cāng)庫(kù),存在于本地。當(dāng)執(zhí)行g(shù)it commit命令后,會(huì)將暫存區(qū)內(nèi)容提交到倉(cāng)庫(kù)之中。.git/objects目錄中存放了每一個(gè)提交的記錄,而在.git/refs目錄下存放的是分支信息和tag信息。
  • 遠(yuǎn)程版本庫(kù)(remote repository), 與本地倉(cāng)庫(kù)概念基本一致,不同之處在于一個(gè)存在遠(yuǎn)程,可用于遠(yuǎn)程協(xié)作,一個(gè)卻是存在于本地。通過(guò)push/pull可實(shí)現(xiàn)本地與遠(yuǎn)程的交互;
  • 遠(yuǎn)程倉(cāng)庫(kù)副本, 可以理解為存在于本地的遠(yuǎn)程倉(cāng)庫(kù)緩存。當(dāng)使用git fetch拉取遠(yuǎn)程代碼倉(cāng)庫(kù)的時(shí)候,就相當(dāng)于在本地有一個(gè)遠(yuǎn)程倉(cāng)庫(kù)的副本,你可以選擇把這個(gè)副本合并到本地倉(cāng)庫(kù)中。

從圖中可以看出來(lái),當(dāng)我們使用git pull拉取代碼的時(shí)候,是直接合并到了本地分支,而使用git fetch拉取代碼的時(shí)候,會(huì)先在本地生成一個(gè)遠(yuǎn)程倉(cāng)庫(kù)的副本,然后使用git merge或者git rebase合并到本地分支。

既然能直接git pull何必多次一舉呢?試想一個(gè)場(chǎng)景,當(dāng)你想合并別人的代碼,又不知道人家改了什么東西,是否能夠跟你代碼合并到一起,這時(shí)候通過(guò)git fetch就能很輕易的實(shí)現(xiàn)。git fetch以后實(shí)際并不會(huì)立馬跟本地分支立馬合并,在git fetch以后,會(huì)顯示如下圖:

聊聊Gitlab中怎么優(yōu)雅的拉取和合并代碼

上圖顯示了遠(yuǎn)程新增了一個(gè)test2分支,在test分支上多了個(gè)一個(gè)提交信息,這時(shí)候在.git/refs/remotes/origin目錄下可以看到多了一個(gè)test2分支。

使用git log origin/test,可以查看具體的提交信息

聊聊Gitlab中怎么優(yōu)雅的拉取和合并代碼

如果想查看提交的內(nèi)容是啥,只能通過(guò)新建一個(gè)分支,

git?checkout?-b?test-origin git?merge?test

講到這里,相信你已經(jīng)明白了git pull和git fetch的區(qū)別了吧。總結(jié)一下:

  • git fetch 更安全,更人性化

  • git pull 更激進(jìn),破壞性更強(qiáng)

一般的Leader在管理項(xiàng)目的時(shí)候都是習(xí)慣性的使用git fetch查看最近新增了哪些分支,做了哪些修改,從而對(duì)項(xiàng)目做出更好的把控。

merge or rebase

上面提到的合并操作,一般我們直接是通過(guò)git merge 去合并某個(gè)分支的代碼。先看看直接使用git merge的問(wèn)題,有一條看著很不順眼的Merge branch信息,如下圖所示:

聊聊Gitlab中怎么優(yōu)雅的拉取和合并代碼

下圖是合并后的一個(gè)流程圖,當(dāng)我們?cè)趍ain分支拉一個(gè)dev進(jìn)行開(kāi)發(fā),這時(shí)候兩個(gè)分支都有提交記錄,當(dāng)我們合并的時(shí)候,正常情況應(yīng)該是在main的基礎(chǔ)上,直接合并,而不是多了一個(gè)C7的提交信息,也就是上面提到的Merge branch,這顯然是一個(gè)很不合理的現(xiàn)象(當(dāng)然這也不影響git正常工作)。

聊聊Gitlab中怎么優(yōu)雅的拉取和合并代碼

那如何解決這個(gè)現(xiàn)象導(dǎo)致的問(wèn)題呢?答案就是git rebase,俗稱變基。

下面我們先來(lái)看看變基以后git分支是什么樣的了

聊聊Gitlab中怎么優(yōu)雅的拉取和合并代碼

可以看到,當(dāng)dev分支更新之后,它會(huì)指向這些新創(chuàng)建的提交(commit),而那些老的提交會(huì)被丟棄。

示例操作

上面講了這么多,現(xiàn)在讓我們來(lái)實(shí)際操作一下。

場(chǎng)景:遠(yuǎn)程有一個(gè)main分支上有內(nèi)容更新,現(xiàn)在我們需要把更新的內(nèi)容合并到本地dev分支上,然后push到遠(yuǎn)程dev分支,當(dāng)前分支實(shí)在dev分支。

簡(jiǎn)單實(shí)現(xiàn)(就是很樸實(shí)無(wú)華):

#?拉取main分支代碼 git?fetch?origin?main #?合并到dev git?rebase?origin/main

上面的git rebase還有個(gè)快捷的操作,直接一行命令搞定

#?拉取test分支代碼合并到dev git?pull?--rebase?origin?test

如果你不想每次都添加rebase,可以在終端中輸入下面的命令:

git?config?--global?pull.rebase?true

這個(gè)配置就是告訴git在每次pull前先進(jìn)行rebase操作

其他命令參考

# 查看本地分支 git branch # 查看遠(yuǎn)程分支 git branch -r # 查看所有分支 git branch -a  # 拉取所有遠(yuǎn)程分支代碼 git fetch  # 拉取origin源上所有分支代碼 git fetch origin # 拉取orign源上main分支代碼 git fetch origin main  # 拉取遠(yuǎn)程分支到新建的一個(gè)本地分支并 git checkout -b newBrach origin/master # 合并遠(yuǎn)程分支到本地 git pull --rebase origin master  # 查看提交日志 git log --oneline # 查看某個(gè)人提交的日志 git log --author=xiumubai --oneline # 查看某個(gè)文件提交的記錄 git blame README.md # 查看某次提交的內(nèi)容 git show <commitid> # 查看最近幾次的提交  git log -p -n

(學(xué)習(xí)視頻分享:編程基礎(chǔ)視頻

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊6 分享