0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文詳解Git分布式版本控制系統(tǒng)

技術(shù)讓夢(mèng)想更偉大 ? 來(lái)源:技術(shù)讓夢(mèng)想更偉大 ? 作者:技術(shù)讓夢(mèng)想更偉大 ? 2022-10-14 09:48 ? 次閱讀

Git 概述

Git 是一個(gè)免費(fèi)的、開(kāi)源的分布式版本控制系統(tǒng),可以快速高效地處理從小型到大型的各種項(xiàng)目。

Git 的特色是分支,人家圖標(biāo)上都敢這么畫(huà)了。 對(duì)了,這里要提一下,Git 和 Linux 是同一個(gè)爸爸,所以 Linux 系統(tǒng)上能跑的原生指令 Git 上面也都可以,反之也一樣。

git 分區(qū)原理

工作區(qū)。新文件沒(méi)被add到暫存區(qū),顯紅色。

暫存區(qū)。進(jìn)倉(cāng)庫(kù)前暫時(shí)存放區(qū)域,未對(duì)本地倉(cāng)庫(kù)生效。對(duì)暫存區(qū)文件修改,顯藍(lán)色。第一次創(chuàng)建并add到暫存區(qū)的文件,由于遠(yuǎn)程倉(cāng)庫(kù)沒(méi)同步,顯綠色。(注:存放在 “.git/index目錄”。)

本地倉(cāng)庫(kù)。暫存區(qū)commit代碼放入本地倉(cāng)庫(kù),通過(guò) push 推送到遠(yuǎn)程倉(cāng)庫(kù)。(注:存在“.git”目錄。)

遠(yuǎn)程倉(cāng)庫(kù)。在前面的話,倉(cāng)庫(kù)里都有些什么東西只有你自己知道,但是一旦把本地倉(cāng)庫(kù)推到遠(yuǎn)程倉(cāng)庫(kù)之后,倉(cāng)庫(kù)里有什么東西大家就都知道了。

Git 常用指令

29c9202a-4b01-11ed-a3b6-dac502259ad0.png

(本篇講解包括但不限于這些命令。)

設(shè)置用戶簽名

開(kāi)頭兩個(gè)命令是用來(lái)設(shè)置用戶簽名的,這個(gè)一般就用一次就完事兒了,因?yàn)槟阋峤淮a的時(shí)候是需要責(zé)任跟蹤的。

這個(gè) name,email 啥的,人家也不會(huì)去認(rèn)證,不過(guò)組里面肯定是會(huì)有規(guī)范的,也不會(huì)讓你想起啥名就隨便起吧。

初始化本地庫(kù)

新手一般就老老實(shí)實(shí) git init 起手嘛,昨天我也是這么問(wèn)我導(dǎo)師的,他說(shuō)不用,直接 git clone 就好了。我想想也是,團(tuán)隊(duì)開(kāi)發(fā)嘛。

查看本地庫(kù)狀態(tài)

git status
首次查看,工作區(qū)是沒(méi)有什么文件的:
$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
當(dāng)我們新增了一個(gè)文件之后,再查看狀態(tài), 會(huì)檢測(cè)到未追蹤的文件:
$ git status
On branch master
No commits yet
Untracked files:
 (use "git add ..." to include in what will be committed)
 hello.txt
nothing added to commit but untracked files present (use "git add" 
to track)

添加暫存區(qū)

git add 文件名
$ git add hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working 
directory.
再次查看狀態(tài)(檢測(cè)到暫存區(qū)有新文件:)
$ git status
On branch master
No commits yet
Changes to be committed:
 (use "git rm --cached ..." to unstage)
 new file: hello.txt

提交本地庫(kù)

git commit -m "日志信息" 文件名
$ git commit -m "my first commit" hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working 
directory.
[master (root-commit) 86366fa] my first commit
1 file changed, 16 insertions(+)
create mode 100644 hello.txt
再查看狀態(tài)(沒(méi)有文件需要提交):
$ git status
On branch master
nothing to commit, working tree clean

修改文件

修改一下文件之后再查看狀態(tài):

$ git status
On branch master
Changes not staged for commit:
 (use "git add ..." to update what will be committed)
 (use "git checkout -- ..." to discard changes in working 
directory)
 modified: hello.txt
no changes added to commit (use "git add" and/or "git commit -a")
那么接下來(lái)就需要再次將修改的文件提交到暫存區(qū),然后提交到本地倉(cāng)庫(kù)。

查看歷史版本

git reflog 查看版本信息
git log 查看版本詳細(xì)信息
如果是想快速瀏覽版本信息,可以使用 reflog 即可,畢竟公司項(xiàng)目版本迭代信息可能已經(jīng)很多了,想看詳細(xì)日志也得看你有沒(méi)有那個(gè)精力了。
$ git reflog
087a1a7 (HEAD -> master) HEAD@{0}: commit: my third commit
ca8ded6 HEAD@{1}: commit: my second commit
86366fa HEAD@{2}: commit (initial): my first commit

版本

以前我只知道版本回退,現(xiàn)在我知道原來(lái)還能向新。

git reset --hard 版本號(hào)
版本號(hào)是什么?版本號(hào),查看一下日志就能看到了。
$ git reflog
087a1a7 (HEAD -> master) HEAD@{0}: commit: my third commit
ca8ded6 HEAD@{1}: commit: my second commit
86366fa HEAD@{2}: commit (initial): my first commit
--切換到 86366fa 版本,也就是我們第一次提交的版本
$ git reset --hard 86366fa
HEAD is now at 86366fa my first commit
--切換完畢之后再查看歷史記錄,當(dāng)前成功切換到了 86366fa 版本
$ git reflog
86366fa (HEAD -> master) HEAD@{0}: reset: moving to 86366fa
087a1a7 HEAD@{1}: commit: my third commit
ca8ded6 HEAD@{2}: commit: my second commit
86366fa (HEAD -> master) HEAD@{3}: commit (initial): my first commit
--然后查看文件 hello.txt,發(fā)現(xiàn)文件內(nèi)容已經(jīng)變化
Git 切換版本,底層其實(shí)是移動(dòng)的 HEAD 指針。

Git 分支操作

在版本控制過(guò)程中,同時(shí)推進(jìn)多個(gè)任務(wù),為每個(gè)任務(wù),我們就可以創(chuàng)建每個(gè)任務(wù)的單獨(dú)分支。使用分支意味著程序員可以把自己的工作從開(kāi)發(fā)主線上分離開(kāi)來(lái),開(kāi)發(fā)自己分支的時(shí)候,不會(huì)影響主線分支的運(yùn)行。對(duì)于初學(xué)者而言,分支可以簡(jiǎn)單理解為副本,一個(gè)分支就是一個(gè)單獨(dú)的副本。(分支底層其實(shí)也是指針的引用。)

分支基本操作

查看分支

小伙子,不要一上來(lái)就想著創(chuàng)建分支嘛。先看看前輩們已經(jīng)達(dá)到了哪個(gè)高度了嘛。

git branch -v
$ git branch -v
* master 087a1a7 my third commit (*代表當(dāng)前所在的分區(qū))

創(chuàng)建分支

git branch 分支名
$ git branch hot-fix
$ git branch -v
hot-fix 087a1a7 my third commit (剛創(chuàng)建的新的分支,并將主分支 master
的內(nèi)容復(fù)制了一份)
* master 087a1a7 my third commit

分支開(kāi)發(fā)

接下來(lái)就可以在分支上進(jìn)行開(kāi)發(fā)了,開(kāi)發(fā)完之后記得將代碼提交到本地倉(cāng)庫(kù)。

切換分支

git checkout 分支名
$ git checkout hot-fix
Switched to branch 'hot-fix'
--發(fā)現(xiàn)當(dāng)先分支已由 master 改為 hot-fix

合并分支

git merge 分支名
這里有個(gè)要注意的點(diǎn):不僅是可以把旁支合并到主支上,主支也可以被合并到分支上,分支之間也可以互相合并。 反正你愛(ài)怎么玩怎么玩,都是在你本地倉(cāng)庫(kù)上,又沒(méi)有推送到遠(yuǎn)程倉(cāng)庫(kù)。 那現(xiàn)在我們想把旁支合并到主支上要怎么做呢?
1、切換到主支
2、git merge 旁支名
這樣就萬(wàn)事大吉了嗎?不一定的。腦子清醒的話很容易想到一個(gè)問(wèn)題:主支修改了一個(gè)文件,分支也修改了同一個(gè)文件,現(xiàn)在以誰(shuí)的為準(zhǔn)? 腦子更清醒的人就要說(shuō)了:你傻呀,我 clone 下來(lái)就切到分支去操作了,在我本地倉(cāng)庫(kù)我又不會(huì)去動(dòng)主支的。 腦子再清醒一點(diǎn)的人已經(jīng)懶的跟他說(shuō)了:大哥,咱這是團(tuán)隊(duì)開(kāi)發(fā),咱的本地倉(cāng)庫(kù)早晚是都要合并到主線上的。

合并沖突解決

沖突產(chǎn)生的表現(xiàn):后面狀態(tài)為 MERGING 打開(kāi)沖突文件可以看到?jīng)_突的地方:

hello git! hello atguigu!
<<<<<<< HEAD
hello git! hello atguigu! master test
hello git! hello atguigu!
=======
hello git! hello atguigu!
hello git! hello atguigu! hot-fix test
>>>>>>> hot-fix
HEAD 到 === 的部分是主支的,后面是 hot-fix 的 沖突產(chǎn)生的原因: 合并分支時(shí),兩個(gè)分支在同一個(gè)文件的同一個(gè)位置有兩套完全不同的修改。Git 無(wú)法替我們決定使用哪一個(gè)。必須人為決定新代碼內(nèi)容。 解決辦法:
1、刪掉沖突中不要的部分,留下最終的部分
2、git add 添加到暫存區(qū)
3、 git commit -m 注意,此時(shí)的 commit 后面不能帶文件名。帶文件名是幾個(gè)意思呢?到底用哪個(gè)呢?
然后就會(huì)發(fā)現(xiàn)合并成功了。

Git 團(tuán)隊(duì)協(xié)作機(jī)制

團(tuán)隊(duì)協(xié)作

跨團(tuán)隊(duì)協(xié)作

pYYBAGNIwN6AXiBeAAIVSmCAlcs947.png

遠(yuǎn)程倉(cāng)庫(kù)

這里不說(shuō) github,因?yàn)檫€有 gitlab,公司內(nèi)部代碼怎么能放到廣域網(wǎng)上呢?。?!

2b04f81a-4b01-11ed-a3b6-dac502259ad0.png

別名

為什么要?jiǎng)e名呢?其實(shí)起不起別名都無(wú)所謂,主要是有個(gè)別名方便操作。你說(shuō)是記一個(gè)網(wǎng)址容易還是記一個(gè)自己起的名字容易嘞?

$ git remote -v
$ git remote add ori https://github.com/xxx.git
$ git remote -v
ori https://github.com/xxx.git (fetch)
ori https://github.com/xxx.git (push)

推送本地倉(cāng)庫(kù)到遠(yuǎn)程倉(cāng)庫(kù)

當(dāng)文件還在本地倉(cāng)庫(kù)的時(shí)候,咱怎么玩都行。但是一旦推送上去了,那就產(chǎn)生歷史版本了,大家都看得到了。 不過(guò)這個(gè)推送啊,也不是咱想推送就能推送的,還得管理員給咱授權(quán),這個(gè)不難理解吧。

git push 別名 分支
$ git push ori master
Logon failed, use ctrl+c to cancel basic credential prompt.
Username for 'https://github.com': atguiguyueyue
Counting objects: 3, done.
Delta compression using up to 12 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 276 bytes | 276.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/atguiguyueyue/git-shTest.git
* [new branch] master -> master

克隆遠(yuǎn)程倉(cāng)庫(kù)到本地

這不用說(shuō)吧,這個(gè)很簡(jiǎn)單。咱雖然說(shuō)之前不會(huì)推送,但是拉取還是沒(méi)有問(wèn)題的。 clone 會(huì)做如下操作: 1、拉取代碼。 2、初始化本地倉(cāng)庫(kù)。 3、創(chuàng)建別名。 會(huì)創(chuàng)建別名,你 clone 之后用 git remote -v 看一下,一般是 origin。

拉取遠(yuǎn)程庫(kù)內(nèi)容

這個(gè)有兩個(gè)辦法,昨天我用的是先 clone,在 checkout 的方式選擇我要的分支。 也可以直接 pull:

git pull 遠(yuǎn)程庫(kù)地址別名 遠(yuǎn)程分支名
$ git pull ori master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/atguiguyueyue/git-shTest
* branch master -> FETCH_HEAD
 7cb4d02..5dabe6b master -> ori/master
Updating 7cb4d02..5dabe6b
Fast-forward
hello.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11304

    瀏覽量

    209521
  • 開(kāi)源
    +關(guān)注

    關(guān)注

    3

    文章

    3349

    瀏覽量

    42501
  • Git
    Git
    +關(guān)注

    關(guān)注

    0

    文章

    199

    瀏覽量

    15765
  • 控制系數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    2319

原文標(biāo)題:一聽(tīng)就懂的Git詳解

文章出處:【微信號(hào):技術(shù)讓夢(mèng)想更偉大,微信公眾號(hào):技術(shù)讓夢(mèng)想更偉大】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    GIT(分布式版本控制系統(tǒng))的工作原理

    都是完整的,功能更強(qiáng)大,自然而然操作更復(fù)雜些。git在本地也是以git版本庫(kù)的形式管理,可以在本地做些修改,然后commit到本地的
    的頭像 發(fā)表于 12-21 16:09 ?829次閱讀
    <b class='flag-5'>GIT</b>(<b class='flag-5'>分布式</b><b class='flag-5'>版本</b><b class='flag-5'>控制系統(tǒng)</b>)的工作原理

    分布式控制系統(tǒng)

    和集中控制的自動(dòng)控制系統(tǒng)。分布式控制系統(tǒng)采用微處理機(jī)分別控制各個(gè)回路,而用中小型工業(yè)控制計(jì)算機(jī)或高性能的微處理機(jī)實(shí)施上
    發(fā)表于 03-01 22:19

    基于STM和MSP的分布式多步進(jìn)電機(jī)控制系統(tǒng)設(shè)計(jì)

    本帖最后由 南中南 于 2016-1-7 11:05 編輯 針對(duì)多步進(jìn)電機(jī)控制系統(tǒng)的要求,設(shè)計(jì)了基于STM32和MSP430的分布式多步進(jìn)電機(jī)控制系統(tǒng)。分享下
    發(fā)表于 01-07 10:16

    分布式控制系統(tǒng)的組成是什么?

    由多臺(tái)計(jì)算機(jī)分別控制生產(chǎn)過(guò)程中多個(gè)控制回路,同時(shí)又可集中獲取數(shù)據(jù)、集中管理和集中控制的自動(dòng)控制系統(tǒng)分布式控制系統(tǒng)采用微處理機(jī)分別
    發(fā)表于 03-13 09:02

    如何去設(shè)計(jì)分布式車(chē)身控制系統(tǒng)

    分布式車(chē)身控制系統(tǒng)的結(jié)構(gòu)是怎樣構(gòu)成的?分布式車(chē)身控制系統(tǒng)有哪些功能?
    發(fā)表于 05-13 07:03

    請(qǐng)問(wèn)怎樣去設(shè)計(jì)種車(chē)門(mén)分布式控制系統(tǒng)?

    種介紹基于CAN/LIN總線的車(chē)門(mén)分布式控制系統(tǒng)設(shè)計(jì)
    發(fā)表于 05-14 06:44

    在RT-Thread studio上使用GIT進(jìn)行工程管理

    新的特性,功能等則是其他分支?! ∪绾问褂?Git 的分支特性并無(wú)標(biāo)準(zhǔn)答案,但卻有大家總結(jié)或約定俗稱的使用方式,這里推薦簡(jiǎn)要了解git分支管理策略?! ∧敲词裁词?b class='flag-5'>分布式
    發(fā)表于 09-19 17:05

    LabVIEW用于分布式測(cè)量與控制系統(tǒng)

    LabVIEW用于分布式測(cè)量與控制系統(tǒng):如果您需要?jiǎng)?chuàng)建個(gè)分布式測(cè)量與控制系統(tǒng),LabVIEW將提供簡(jiǎn)化的
    發(fā)表于 07-24 11:28 ?44次下載

    Freelance 2019發(fā)布 是分布式控制系統(tǒng)的最新版本

    Freelance最初版本發(fā)布于1994年,是ABB針對(duì)過(guò)程工業(yè)提供的經(jīng)濟(jì)高效的分布式控制系統(tǒng)(DCS)解決方案。它結(jié)合了DCS與可編程邏輯控制器(PLC)的優(yōu)點(diǎn),具有易用性、可擴(kuò)展性、靈活性和可靠性的特點(diǎn)。Freelance
    發(fā)表于 12-06 16:19 ?4998次閱讀

    Git是什么?Git的基本使用資料說(shuō)明

      Git是什么? Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)(沒(méi)有之)。
    發(fā)表于 05-29 17:56 ?1次下載
    <b class='flag-5'>Git</b>是什么?<b class='flag-5'>Git</b>的基本使用資料說(shuō)明

    SVN與Git的最主要的區(qū)別?

    Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)。
    發(fā)表于 07-08 10:46 ?5429次閱讀

    Git在實(shí)際工作中的基本使用方法

    代碼版本控制對(duì)于我們嵌入軟件開(kāi)發(fā)崗是項(xiàng)基礎(chǔ)、必備的技能,需要熟練掌握。實(shí)際工作中常用的版本控制系統(tǒng)
    的頭像 發(fā)表于 09-14 18:12 ?2573次閱讀

    Git原理詳解及實(shí)用指南的學(xué)習(xí)資料合集免費(fèi)下載

    很多人認(rèn)為 Git 難以理解的第個(gè)門(mén)檻在于:所謂的「Git個(gè)分布式版本
    發(fā)表于 01-31 08:00 ?0次下載
    <b class='flag-5'>Git</b>原理<b class='flag-5'>詳解</b>及實(shí)用指南的學(xué)習(xí)資料合集免費(fèi)下載

    開(kāi)源的分布式版本控制系統(tǒng)Git配置

    ? 今天帶著大家來(lái)學(xué)習(xí)Git,這是個(gè)開(kāi)源的分布式版本控制系統(tǒng),幫助我們進(jìn)行項(xiàng)目的管理更迭。 其實(shí)關(guān)于G
    的頭像 發(fā)表于 03-09 13:47 ?1479次閱讀

    世界上最先進(jìn)分布式版本控制系統(tǒng)Git介紹

    世界上最先進(jìn)的分布式版本控制系統(tǒng)。 簡(jiǎn)單理解版本控制就是:比如你修改了代碼,然后提交修改,系統(tǒng)
    的頭像 發(fā)表于 06-09 17:40 ?2019次閱讀