10分鐘帶你入門Git到GitHub

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可以在LinuxUnixMacWindows這幾大平臺上安裝了,可以根據自己的操作系統去官網下載。

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
  • 刪除分支

  1. 刪除本地分支git branch -d <name>

 git branch -d feature_a
  1. 刪除遠程分支git branch -D <name>

實際項目中如果我們需要開發一個功能完整的流程是什麼樣的呢?多數公司模式應該下面這樣的流程吧。1.先基於主幹分支 拉出一個功能分支(feature_xx)進行開發。2.開發完成後測試基於這個功能分支進行測試。3.測試完成後,開發把功能分支合併到主幹分支。合併代碼操作如下:

  1. 先切換到主幹分支(release),主幹分支git pull 拉下遠程分支最新代碼(可能有同事提交了新的代碼)

  2. 切回到功能分支 把本地主幹最新代碼合(git merge)併到當前功能分支,如果合併有衝突就解決衝突後重新提交。

  3. 切換到主幹分支執行git merge 功能分支。(這一步實際工作中一般人是不能這麼操作的),代碼必須要先發起一個merge request 經過代碼review才能進行合併到主幹分支的。

  4. 合併完主幹分支後,功能分支就可以刪除了。

總結

  • 以上命令基本上可以應付工作中大多數場景了,不過git還有很多高級的玩法。如果大家想更深入學習瞭解的話,我這邊爲大家整理了一份Git的學習資料,從學習入門到高階。還有git所有命令的思維導圖。公衆號【java金融】回覆【git】就可以免費獲取了。

  • 還爲大家找了一個可以在線練習git的學習網站。趕緊去試試吧,超級有意思,相信你一口氣就通關了。https://learngitbranching.js.org/?locale=zh_CN

  • 視頻地址https://www.bilibili.com/video/BV1Xt4y1X73x/

精彩推薦
一百期Java面試題彙總SpringBoot內容聚合IntelliJ IDEA內容聚合Mybatis內容聚合

歡迎長按下圖關注公衆號後端技術精選

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章