Git 概述
Git 是一個(gè)免費(fèi)的、開源的分布式版本控制系統(tǒng),可以快速高效地處理從小型到大型的各種項(xiàng)目。
Git 的特色是分支,人家圖標(biāo)上都敢這么畫了。 對(duì)了,這里要提一下,Git 和 Linux 是同一個(gè)爸爸,所以 Linux 系統(tǒng)上能跑的原生指令 Git 上面也都可以,反之也一樣。
git 分區(qū)原理
工作區(qū)。新文件沒被add到暫存區(qū),顯紅色。
暫存區(qū)。進(jìn)倉庫前暫時(shí)存放區(qū)域,未對(duì)本地倉庫生效。對(duì)暫存區(qū)文件修改,顯藍(lán)色。第一次創(chuàng)建并add到暫存區(qū)的文件,由于遠(yuǎn)程倉庫沒同步,顯綠色。(注:存放在 “.git/index目錄”。)
本地倉庫。暫存區(qū)commit代碼放入本地倉庫,通過 push 推送到遠(yuǎn)程倉庫。(注:存在“.git”目錄。)
遠(yuǎn)程倉庫。在前面的話,倉庫里都有些什么東西只有你自己知道,但是一旦把本地倉庫推到遠(yuǎn)程倉庫之后,倉庫里有什么東西大家就都知道了。
Git 常用指令
(本篇講解包括但不限于這些命令。)
設(shè)置用戶簽名
開頭兩個(gè)命令是用來設(shè)置用戶簽名的,這個(gè)一般就用一次就完事兒了,因?yàn)槟阋峤淮a的時(shí)候是需要責(zé)任跟蹤的。
這個(gè) name,email 啥的,人家也不會(huì)去認(rèn)證,不過組里面肯定是會(huì)有規(guī)范的,也不會(huì)讓你想起啥名就隨便起吧。
初始化本地庫
新手一般就老老實(shí)實(shí) git init 起手嘛,昨天我也是這么問我導(dǎo)師的,他說不用,直接 git clone 就好了。我想想也是,團(tuán)隊(duì)開發(fā)嘛。
查看本地庫狀態(tài)
git status首次查看,工作區(qū)是沒有什么文件的:
$ 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ì)檢測到未追蹤的文件:
$ 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)(檢測到暫存區(qū)有新文件:)
$ git status On branch master No commits yet Changes to be committed: (use "git rm --cached..." to unstage) new file: hello.txt
提交本地庫
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)(沒有文件需要提交):
$ 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那么接下來就需要再次將修改的文件提交到暫存區(qū),然后提交到本地倉庫。..." 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")
查看歷史版本
git reflog 查看版本信息 git log 查看版本詳細(xì)信息如果是想快速瀏覽版本信息,可以使用 reflog 即可,畢竟公司項(xiàng)目版本迭代信息可能已經(jīng)很多了,想看詳細(xì)日志也得看你有沒有那個(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)在我知道原來還能向新。
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 分支操作
在版本控制過程中,同時(shí)推進(jìn)多個(gè)任務(wù),為每個(gè)任務(wù),我們就可以創(chuàng)建每個(gè)任務(wù)的單獨(dú)分支。使用分支意味著程序員可以把自己的工作從開發(fā)主線上分離開來,開發(fā)自己分支的時(shí)候,不會(huì)影響主線分支的運(yùn)行。對(duì)于初學(xué)者而言,分支可以簡單理解為副本,一個(gè)分支就是一個(gè)單獨(dú)的副本。(分支底層其實(shí)也是指針的引用。)
分支基本操作
查看分支
小伙子,不要一上來就想著創(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
分支開發(fā)
接下來就可以在分支上進(jìn)行開發(fā)了,開發(fā)完之后記得將代碼提交到本地倉庫。
切換分支
git checkout 分支名
$ git checkout hot-fix Switched to branch 'hot-fix' --發(fā)現(xiàn)當(dāng)先分支已由 master 改為 hot-fix
合并分支
git merge 分支名這里有個(gè)要注意的點(diǎn):不僅是可以把旁支合并到主支上,主支也可以被合并到分支上,分支之間也可以互相合并。 反正你愛怎么玩怎么玩,都是在你本地倉庫上,又沒有推送到遠(yuǎn)程倉庫。 那現(xiàn)在我們想把旁支合并到主支上要怎么做呢?
1、切換到主支 2、git merge 旁支名這樣就萬事大吉了嗎?不一定的。腦子清醒的話很容易想到一個(gè)問題:主支修改了一個(gè)文件,分支也修改了同一個(gè)文件,現(xiàn)在以誰的為準(zhǔn)? 腦子更清醒的人就要說了:你傻呀,我 clone 下來就切到分支去操作了,在我本地倉庫我又不會(huì)去動(dòng)主支的。 腦子再清醒一點(diǎn)的人已經(jīng)懶的跟他說了:大哥,咱這是團(tuán)隊(duì)開發(fā),咱的本地倉庫早晚是都要合并到主線上的。
合并沖突解決
沖突產(chǎn)生的表現(xiàn):后面狀態(tài)為 MERGING 打開沖突文件可以看到?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-fixHEAD 到 === 的部分是主支的,后面是 hot-fix 的 沖突產(chǎn)生的原因: 合并分支時(shí),兩個(gè)分支在同一個(gè)文件的同一個(gè)位置有兩套完全不同的修改。Git 無法替我們決定使用哪一個(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é)作
遠(yuǎn)程倉庫
這里不說 github,因?yàn)檫€有 gitlab,公司內(nèi)部代碼怎么能放到廣域網(wǎng)上呢?。?!
別名
為什么要?jiǎng)e名呢?其實(shí)起不起別名都無所謂,主要是有個(gè)別名方便操作。你說是記一個(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)
推送本地倉庫到遠(yuǎn)程倉庫
當(dāng)文件還在本地倉庫的時(shí)候,咱怎么玩都行。但是一旦推送上去了,那就產(chǎn)生歷史版本了,大家都看得到了。 不過這個(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)程倉庫到本地
這不用說吧,這個(gè)很簡單。咱雖然說之前不會(huì)推送,但是拉取還是沒有問題的。 clone 會(huì)做如下操作: 1、拉取代碼。 2、初始化本地倉庫。 3、創(chuàng)建別名。 會(huì)創(chuàng)建別名,你 clone 之后用 git remote -v 看一下,一般是 origin。
拉取遠(yuǎn)程庫內(nèi)容
這個(gè)有兩個(gè)辦法,昨天我用的是先 clone,在 checkout 的方式選擇我要的分支。 也可以直接 pull:
git pull 遠(yuǎn)程庫地址別名 遠(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(-)
-
Linux
+關(guān)注
關(guān)注
87文章
11261瀏覽量
209229 -
開源
+關(guān)注
關(guān)注
3文章
3293瀏覽量
42452 -
Git
+關(guān)注
關(guān)注
0文章
197瀏覽量
15751 -
控制系數(shù)
+關(guān)注
關(guān)注
0文章
4瀏覽量
2318
原文標(biāo)題:一聽就懂的Git詳解
文章出處:【微信號(hào):技術(shù)讓夢(mèng)想更偉大,微信公眾號(hào):技術(shù)讓夢(mèng)想更偉大】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論