git的產生背景
開局先來一個故事吧,故事看完如果不想看枯燥無味的指令,沒關係我已經把這篇文章的內容錄製成了一個視頻,點擊文末閱讀原文就可以觀看。或者說你已經熟練掌握git
的使用了,可以直接跳到總結部分(一個好玩的遊戲)去檢驗下你掌握的熟練程度。
很多人都知道,Linus在1991年創建了開源的Linux,從此,Linux系統不斷髮展,已經成爲最大的服務器系統軟件了。Linus雖然創建了Linux,但Linux的壯大是靠全世界熱心的志願者參與的,這麼多人在世界各地爲Linux編寫代碼,那Linux的代碼是如何管理的呢?事實是,在2002年以前,世界各地的志願者把源代碼文件通過diff的方式發給Linus,然後由Linus本人通過手工方式合併代碼!你也許會想,爲什麼Linus不把Linux代碼放到版本控制系統裏呢?不是有CVS、SVN這些免費的版本控制系統嗎?因爲Linus堅定地反對CVS和SVN,這些集中式的版本控制系統不但速度慢,而且必須聯網才能使用。有一些商用的版本控制系統,雖然比CVS、SVN好用,但那是付費的,和Linux的開源精神不符。不過,到了2002年,Linux系統已經發展了十年了,代碼庫之大讓Linus很難繼續通過手工方式管理了,社區的弟兄們也對這種方式表達了強烈不滿,於是Linus選擇了一個商業的版本控制系統BitKeeper,BitKeeper的東家BitMover公司出於人道主義精神,授權Linux社區免費使用這個版本控制系統。安定團結的大好局面在2005年就被打破了,原因是Linux社區牛人聚集,不免沾染了一些梁山好漢的江湖習氣。開發Samba的Andrew試圖破解BitKeeper的協議(這麼幹的其實也不只他一個),被BitMover公司發現了(監控工作做得不錯!),於是BitMover公司怒了,要收回Linux社區的免費使用權。Linus可以向BitMover公司道個歉,保證以後嚴格管教弟兄們,嗯,這是不可能的。實際情況是這樣的:Linus花了兩週時間自己用C寫了一個分佈式版本控制系統,這就是Git!一個月之內,Linux系統的源碼已經由Git管理了!牛是怎麼定義的呢?大家可以體會一下。Git迅速成爲最流行的分佈式版本控制系統,尤其是2008年,GitHub網站上線了,它爲開源項目免費提供Git存儲,無數開源項目開始遷移至GitHub,包括jQuery,PHP,Ruby等等。歷史就是這麼偶然,如果不是當年BitMover公司威脅Linux社區,可能現在我們就沒有免費而超級好用的Git了。
git 的安裝
本文使用的是win7平臺。 Git
可以在Linux
、Unix
、Mac
和Windows
這幾大平臺上安裝了,可以根據自己的操作系統去官網下載。
git 常見命令
介紹命令之前先來張圖吧,所有的命令都是圍繞張圖的
Workspace:工作區,就是你平時存放項目代碼的地方
Index / Stage:暫存區,用於臨時存放文件的改動,事實上它只是一個文件,保存即將提交到文件列表信息。
Repository:本地倉庫區(或版本庫),就是安全存放數據的位置,這裏面有我們提交到所有版本的數據。其中HEAD指向最新放入倉庫的版本。
Remote:遠程倉庫,託管代碼的服務器。弄清楚上面四個概念,我們就開始實操吧。
通過
git init
命令創建Git
可以管理的倉庫(本地庫初始化)
Administrator@XCRBHXD05IEZEVS MINGW64 /d
$ mkdir gitstudy
Administrator@XCRBHXD05IEZEVS MINGW64 /d
$ cd gitstudy/
Administrator@XCRBHXD05IEZEVS MINGW64 /d/gitstudy
$ git init
Initialized empty Git repository in D:/gitstudy/.git/
執行完這個命令我們可以看到文件下面會多一個.git
的文件夾,以後在這個文件夾下(工作區)的都可以被git
管理了。
git add
命令把文件添加到暫存區。下面我們創建(echo
>文件名字)一個demo.txt
文件
$ echo > demo.txt
此時的demo.txt
文件是帶個藍色?
的,當我們執行git add - demo.txt
後那如果這個目錄下面有幾百個文件都要加到暫存區怎麼辦?此時可以使用git add .
這個命令可以把當前目錄下所有文件加入暫存區。
git status
查看顯示工作區和暫存區的狀態。
$ git status
git commit -m"提交信息描述"
命令把文件添加到本地倉庫。
$ git commit -m"第一次提交"
[master (root-commit) 22f0a2b] 第一次提交
1 file changed, 1 insertion(+)
create mode 100644 demo.txt
提交後demo.txt
顏色是不是變綠了。
git commit -am"文件描述"
【am
】 就是 【add modify
】 兩個命令的合併。比如我們修改了兩個文件demo.txt和demo1.txt。這時候我們可以直接使用git commit -am
命令
git commit -am"第三次提交"
如果新增了文件,必須使用分開的命令,不能用合併命令。
git add .
git commit -m 'update'
回退
未使用git add(文件必須是commit 過的)
使用
git checkout -- filename
(文件名)注意中間有--
$ git checkout -- demo.txt
回退所有的文件修改使用
git checkout .
git checkout .
已使用git add,未使用git commit
使用
git reset HEAD filename
(指定文件名)
git reset HEAD demo.txt
回退所有文件修改
git reset HEAD
git reset HEAD
在使用本命令後,本地的修改並不會消失,而是回到了上面 未使用git add
緩存代碼,繼續使用用git checkout -- filename
,就可以放棄本地修改。
已使用 git commit 未push
git reset --hard HEAD^
回退到上一次commit的狀態(這個命令需謹慎執行)。HEAD^
(代表上一次)或者通過git reset --hard <commitid>
(是版本號 可以根據git log
查看,每次commit
都會生成一個)
git reset --hard HEAD^
git reset --mixed HEAD^
(--mixed
也可以省略),保留工作區,並且清空暫存區。就是回到上一次git add
之前。
git reset HEAD^
git reset --soft HEAD^
重置HEAD
到指定的版本,不會修改暫存區和暫存區就是回到上一次git commit
之前,適用於合併commit節點。
git reset --soft HEAD^
git revert <commitid>
會回退到之前的那次提交,會產生一個新的commit
,將這次回退作爲一次修改記錄提交,這樣的好處是不修改歷史提交記錄。
git revert e241441d8a85b2d89
已使用 push
git push -f
可以在本地執行以上操作後,然後強行推送到遠程倉庫
git push -f
刪除
git rm <文件名>
這個必須是commit
之後的文件
git rm demo.txt
git rm -f <文件名>
這個執行add
未執行commit
可以刪除
git rm -f 4.txt
遠程倉庫
以上都是在本地倉庫進行操作的,提交的代碼別人也是看不到的,如果寫着代碼硬盤壞了咋辦?那是不是所有的代碼都沒了。所以寫完了代碼趕緊推送到服務器上去。
添加遠程庫
用命令git remote add origin git@server-name:path/repo-name.git;
關聯遠程倉庫
關聯之前肯定要在遠程創建倉庫
首先要到https://github.com/全球最大同性交友網站上註冊一個賬號。已有賬號的就忽略了。
接下來就是新建一個遠程倉庫了。
git remote add origin [email protected]:workit1/studygit.git
關聯後,使用命令git push -u origin master
第一次推送master
分支的所有內容。
git push -u origin master
以後,每次本地提交後可以使用命令git push origin master
推送最新修改到遠程倉庫。
從遠程庫克隆
前面我們瞭解先有本地倉庫,再有遠程庫的時候,如何關聯遠程庫。但是一般實際開發中我們是先有遠程倉庫的,然後從遠程庫克隆。
git clone https://github.com/workit1/gitstudy.git
分支管理
git checkout -b
<創建分支名> 表示創建並切換分支
Administrator@XCRBHXD05IEZEVS MINGW64 /d/gitstudy (master)
$ git checkout -b feature_a
Switched to a new branch 'feature_a'
基於master
分支創建了feature_a
分支並且切換到了feature_a
分支。
git checkout <name>
或者git switch <name>
切換分支
git checkout master
git branch -a
查看所有分支,包含遠程分支git branch
查看本地所有分支合併分支
git merge master
當有衝突的時候這裏會個正在合併的狀態
取消合併,此時你如果不想合併了,可以使用
git merge --abort
取消。
git merge --abort
刪除分支
刪除本地分支
git branch -d <name>
git branch -d feature_a
刪除遠程分支
git branch -D <name>
實際項目中如果我們需要開發一個功能完整的流程是什麼樣的呢?多數公司模式應該下面這樣的流程吧。1.先基於主幹分支 拉出一個功能分支(feature_xx
)進行開發。2.開發完成後測試基於這個功能分支進行測試。3.測試完成後,開發把功能分支合併到主幹分支。合併代碼操作如下:
先切換到主幹分支(
release
),主幹分支git pull
拉下遠程分支最新代碼(可能有同事提交了新的代碼)切回到功能分支 把本地主幹最新代碼合(
git merge
)併到當前功能分支,如果合併有衝突就解決衝突後重新提交。切換到主幹分支執行
git merge
功能分支。(這一步實際工作中一般人是不能這麼操作的),代碼必須要先發起一個merge request
經過代碼review
才能進行合併到主幹分支的。合併完主幹分支後,功能分支就可以刪除了。
總結
以上命令基本上可以應付工作中大多數場景了,不過
git
還有很多高級的玩法。如果大家想更深入學習瞭解的話,我這邊爲大家整理了一份Git
的學習資料,從學習入門到高階。還有git所有命令的思維導圖。公衆號【java金融】回覆【git】就可以免費獲取了。還爲大家找了一個可以在線練習
git
的學習網站。趕緊去試試吧,超級有意思,相信你一口氣就通關了。https://learngitbranching.js.org/?locale=zh_CN視頻地址https://www.bilibili.com/video/BV1Xt4y1X73x/
精彩推薦
一百期Java面試題彙總SpringBoot內容聚合IntelliJ IDEA內容聚合Mybatis內容聚合
歡迎長按下圖關注公衆號後端技術精選