Git的基本使用

Git的基本使用

關(guān)于Git官網(wǎng)提供的《pro git》應(yīng)該是最全面缓苛,最權(quán)威的使用手冊(cè)了九府。關(guān)于Git的具體概念,來(lái)源承璃,使用等都可以去里查閱學(xué)習(xí)。本文的目的是從零開始以演示Git在實(shí)際項(xiàng)目中的一些基本應(yīng)用蚌本,以幫助讀者快速上手盔粹。

本文默認(rèn)讀者數(shù)量使用window系統(tǒng)且對(duì)命令行操作有一定了解。

要完成的文章內(nèi)容:

  • Git的安裝
  • Git本地倉(cāng)庫(kù)的建立
  • Git克隆程癌,拉取舷嗡,合并,推送
  • Git分支創(chuàng)建嵌莉,分支之間的合并
  • Git遠(yuǎn)程倉(cāng)庫(kù)咬崔,遠(yuǎn)程分支拉去,本地和遠(yuǎn)程的對(duì)應(yīng)關(guān)系烦秩,本地與遠(yuǎn)程的對(duì)應(yīng)關(guān)系綁定
  • 筆記里面其他的關(guān)于Git命令
  • git stash 保存修改的東西到緩存垮斯,然后拉去代碼之后再把緩存的東西釋放出來(lái)

Git安裝

點(diǎn)擊查看原文

在Linux上安裝

如果要在 Linux 上安裝預(yù)編譯好的 Git 二進(jìn)制安裝包,可以直接用系統(tǒng)提供的包管理工具只祠。在 Fedora 上用 yum 安裝:

$ yum install git-core

在 Ubuntu 這類 Debian 體系的系統(tǒng)上兜蠕,可以用 apt-get 安裝:

$ apt-get install git

在Mac上安裝

在 Mac 上安裝 Git 有兩種方式。最容易的當(dāng)屬使用圖形化的 Git 安裝工具抛寝,界面如圖 1-7熊杨,下載地址在:

http://sourceforge.net/projects/git-osx-installer/
img

另一種是通過(guò) MacPorts (http://www.macports.org) 安裝曙旭。如果已經(jīng)裝好了 MacPorts,用下面的命令安裝 Git:

$ sudo port install git-core +svn +doc +bash_completion +gitweb

這種方式就不需要再自己安裝依賴庫(kù)了晶府,Macports 會(huì)幫你搞定這些麻煩事桂躏。一般上面列出的安裝選項(xiàng)已經(jīng)夠用,要是你想用 Git 連接 Subversion 的代碼倉(cāng)庫(kù)川陆,還可以加上 +svn 選項(xiàng)剂习,具體將在第八章作介紹。(譯注:還有一種是使用 homebrew(https://github.com/mxcl/homebrew):brew install git较沪。)

在Windows上安裝

在 Windows 上安裝 Git 同樣輕松鳞绕,有個(gè)叫做 msysGit 的項(xiàng)目提供了安裝包,可以到 GitHub 的頁(yè)面上下載 exe 安裝文件并運(yùn)行:

http://msysgit.github.com/

完成安裝之后尸曼,就可以使用命令行的 git 工具(已經(jīng)自帶了 ssh 客戶端)了们何,另外還有一個(gè)圖形界面的 Git 項(xiàng)目管理工具。

Git的基本操作

注意:以下演示用git對(duì)txt文檔進(jìn)行版本的跟蹤控轿,每次對(duì)txt文件修改或者回滾后注意跟新txt內(nèi)容冤竹。建議使用notpad打開txt文件,它會(huì)自動(dòng)監(jiān)控內(nèi)容改變并且提示更新茬射。

本地倉(cāng)庫(kù)操作示例

初始化新倉(cāng)庫(kù)

在D盤根目錄創(chuàng)建名稱為git的文件夾贴见,接下來(lái)把該文件夾做成本地的git倉(cāng)庫(kù)并進(jìn)行一些基本的操作。

安裝好git軟件之后躲株,進(jìn)入git文件夾片部,在空白處點(diǎn)擊鼠標(biāo)右鍵,選擇Git Bash Here.

執(zhí)行:

zhangmumu@zhangmumu MINGW64 /d/git
$ git init
Initialized empty Git repository in D:/git/.git/  # 這里顯示新增了.git文件

初始化后霜定,在當(dāng)前目錄下會(huì)出現(xiàn)一個(gè)名為 .git 的目錄档悠,所有 Git 需要的數(shù)據(jù)和資源都存放在這個(gè)目錄中。不過(guò)目前望浩,僅僅是按照既有的結(jié)構(gòu)框架初始化好了里邊所有的文件和目錄辖所,但我們還沒(méi)有開始跟蹤管理項(xiàng)目中的任何一個(gè)文件。

查看狀態(tài)

當(dāng)前目錄建立文件git-test.txt里面錄入內(nèi)容:first Content磨德。如上該文件第一次編輯結(jié)束缘回,保存一下。

執(zhí)行:

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status    # 查看目前狀態(tài)(status)經(jīng)常使用的命令
On branch master    #目前所在分支典挑,處于master主分支酥宴,后續(xù)會(huì)提到分支的操作

No commits yet  #目前沒(méi)有任何提交(commits)

Untracked files:    #提示有文件沒(méi)有跟蹤,并且提示下一步怎么操作
  (use "git add <file>..." to include in what will be committed)

        git-test.txt

nothing added to commit but untracked files present (use "git add" to track)

增加跟蹤

執(zhí)行:

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git add git-test.txt

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   git-test.txt

執(zhí)行git add *之后并沒(méi)有返回您觉。再執(zhí)行git status查看當(dāng)前狀態(tài)拙寡,狀態(tài)中可以看到新增了一個(gè)文件,等待提交(commit)琳水,并且提示可以通git rm --cached <file>去unstage該文件肆糕。

stage直接翻譯是階段的意思般堆,git中的stage我理解成暫存,add文件之后是加入了git的暫存區(qū)诚啃。

提交文件

執(zhí)行:

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git commit -m "fist-commit"       #提交命令淮摔,-m 之后的字符串是對(duì)本次提交的備注內(nèi)容
[master (root-commit) 7368c19] fist-commit
 1 file changed, 1 insertion(+)     #顯示文件增加了一行內(nèi)容
 create mode 100644 git-test.txt    

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status
On branch master
nothing to commit, working tree clean

git commit -m " "提交命令,-m之后是輸入對(duì)本次提交的備注內(nèi)容始赎。

提交記錄

查看提交的記錄和橙,執(zhí)行:

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git log
commit 7368c19dc88ca2062b3c24a25334a9ce04824b2c (HEAD -> master)
Author: zhangmumu 
Date:   Sat Sep 8 08:48:34 2018 +0800

    fist-commit

以上顯示目前僅僅有一次提交內(nèi)容。

舍棄修改

在日常文件編輯中极阅,有時(shí)候想放棄當(dāng)前修改回到當(dāng)前git版本中樣子胃碾。git-test.txt文件中的做任意的修改涨享,修改之后想放棄這次修改筋搏。

執(zhí)行:

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status    #查看狀態(tài)可以看到文件有修改內(nèi)容
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   git-test.txt

no changes added to commit (use "git add" and/or "git commit -a")

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git checkout *    # 撤銷當(dāng)前修改,git是支持正則的

zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status    #再次查看狀態(tài)厕隧,干凈的奔脐,修改已經(jīng)被撤銷
On branch master
nothing to commit, working tree clean

如果文件已經(jīng)增加到了stage(暫存區(qū)),怎么回滾吁讨?再次對(duì)文檔進(jìn)行任意修改髓迎,執(zhí)行:

#   修改文件后查看狀態(tài)
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status    
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   git-test.txt

no changes added to commit (use "git add" and/or "git commit -a")
#   文件add增加到暫存區(qū)
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git add *.txt
#   再次查看狀態(tài)
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   git-test.txt

#   git rest HEAD 命令將暫存區(qū)的文件unstage撤出暫存區(qū)
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git reset HEAD *
Unstaged changes after reset:
M       git-test.txt
#   再次查看狀態(tài),文件已經(jīng)撤出暫存區(qū)域建丧,checkout一下就可以撤銷本次修改了
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   git-test.txt

no changes added to commit (use "git add" and/or "git commit -a")

以上的操作消化吸收之后排龄,基本上是入門了。下面做一個(gè)服務(wù)器倉(cāng)庫(kù)的實(shí)際操作翎朱。

遠(yuǎn)程服務(wù)器操作

目前很多網(wǎng)站提供git平臺(tái)進(jìn)行代碼托管的橄维,這里推薦碼云它的文檔中說(shuō)的很詳細(xì)了。碼云提供的GIT大全包含了Git插件拴曲、客戶端争舞、瀏覽器插件、文檔澈灼、常用指令等等竞川。

在日程使用中,感覺遠(yuǎn)程服務(wù)器拉去代碼與本地操作相比較多了pushpull操作叁熔,前者是將本地的代碼推送到遠(yuǎn)程服務(wù)器委乌,后者是將遠(yuǎn)程的代碼拉去到本地。

基本配置

碼云中Git的基本配置說(shuō)的很明白荣回,本地配置用戶名和郵箱之后需要生成并部署SSH KEY用來(lái)讓遠(yuǎn)程項(xiàng)目識(shí)別你的訪問(wèn)權(quán)限福澡,每臺(tái)電腦會(huì)生成自己的key,將key加入到自己的賬號(hào)設(shè)置之后驹马,電腦有訪問(wèn)遠(yuǎn)程服務(wù)器的權(quán)限革砸。

拉取遠(yuǎn)程代碼

通常遠(yuǎn)程代碼地址有兩種

  • HTTPS的除秀,類似這樣:https://gitee.com/zhangmumu_star/[項(xiàng)目名稱].git
  • SSH的,類似這樣:git@gitee.com:zhangmumu_star/[項(xiàng)目名稱].git

建議使用SSH地址算利,HTTPS拉去的時(shí)候需要輸入自己的碼云賬號(hào)和密碼册踩,而SSH則不需要。

在本地建立好工作目錄之后效拭,打開git bash暂吉,拉去代碼命令:

$ git clone git@gitee.com:zhangmumu_star/[項(xiàng)目名稱].git

建立本地分支

建立本地分支且切換到本地分支:

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (master)
$ git checkout -b zz    #建立本地分支并且切換到該分支命令
Switched to a new branch 'zz'

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch #查看分支,目前已經(jīng)在zz分支上面
  master
* zz

分支合并

剛剛從master分支中建立的分支zz是跟master一模一樣的缎患。

如果A分支跟B分支內(nèi)容上有不一樣的話慕的,希望把B分支內(nèi)容跟A分支合并。那么就切換到B分支然后執(zhí)行合并命令:

git checkout B  #切換到B分支
git merge A #目前位于B分支挤渔,mergeA的意思就是把A分支內(nèi)容合并到B分支

查看本地分支與遠(yuǎn)程分支映射關(guān)系

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -vv
  master 5cdaf1a [origin/master] commit
* zz     5cdaf1a commit

映射關(guān)系命令為:Git branch -vv肮街。其中返回結(jié)果中origin表示遠(yuǎn)程的意思,本地的master分支與遠(yuǎn)程的master分支是有映射關(guān)系的判导。本地的zz分支并沒(méi)有與遠(yuǎn)程的分支有映射關(guān)系嫉父。

將本地分支推送到遠(yuǎn)程

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git push origin zz:zz     #將本地分支推送到遠(yuǎn)程
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered by Gitee.com
To gitee.com:zhangmumu_star/framwork_test.git
 * [new branch]      zz -> zz

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -vv        #查看對(duì)應(yīng)關(guān)系
  master 5cdaf1a [origin/master] commit
* zz     5cdaf1a commit

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -a     #查看遠(yuǎn)程分支
  master
* zz
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/zz

可以看到本地分支已經(jīng)推送到了遠(yuǎn)程,但是本地分支跟遠(yuǎn)程分支并沒(méi)有映射關(guān)系眼刃。沒(méi)有映射關(guān)系的時(shí)候在推送和拉去代碼的時(shí)候必須指定好本地分支和遠(yuǎn)程分支绕辖,如下:

 git pull <remote> <branch>     #制定本地分支和遠(yuǎn)程分支
 git push <remote> <branch>

指定的意思就是,把本地分支<branch>推送到遠(yuǎn)程分支<remote>中擂红。反向拉去的時(shí)候意思一樣仪际。

建立映射關(guān)系

在本地分支和遠(yuǎn)程分支沒(méi)有映射關(guān)系的時(shí)候拉去代碼會(huì)有如下提示:

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> zz

建立映射關(guān)系:

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -u origin/zz       #建立映射關(guān)系
Branch 'zz' set up to track remote branch 'zz' from 'origin'.

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -vv        #查看映射關(guān)系
  master 5cdaf1a [origin/master] commit
* zz     5cdaf1a [origin/zz] commit

此外也可以使用上面提示的語(yǔ)句建立映射關(guān)系:

git branch --set-upstream-to=origin/<branch> zz
# 上面的<branch>指的是遠(yuǎn)程分支的名,zz指的是本地分支名

拉取到本地

在已經(jīng)克隆了代碼并且做好映射關(guān)系之后昵骤,將代碼拉取到本地的方法:

Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git pull
Already up to date.

提交到遠(yuǎn)程

跟本地<a href="#提交文件">提交文件</a>的區(qū)別是树碱,在依次執(zhí)行完add,commit命名之后需要執(zhí)行push命令來(lái)將本地的代碼提交到遠(yuǎn)程。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涉茧,一起剝皮案震驚了整個(gè)濱河市赴恨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伴栓,老刑警劉巖伦连,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異钳垮,居然都是意外死亡惑淳,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門饺窿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)歧焦,“玉大人,你說(shuō)我怎么就攤上這事【钼桑” “怎么了向瓷?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)舰涌。 經(jīng)常有香客問(wèn)我猖任,道長(zhǎng),這世上最難降的妖魔是什么瓷耙? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任朱躺,我火速辦了婚禮,結(jié)果婚禮上搁痛,老公的妹妹穿的比我還像新娘长搀。我一直安慰自己,他們只是感情好鸡典,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布源请。 她就那樣靜靜地躺著,像睡著了一般轿钠。 火紅的嫁衣襯著肌膚如雪巢钓。 梳的紋絲不亂的頭發(fā)上病苗,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天疗垛,我揣著相機(jī)與錄音,去河邊找鬼硫朦。 笑死贷腕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咬展。 我是一名探鬼主播泽裳,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼破婆!你這毒婦竟也來(lái)了涮总?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤祷舀,失蹤者是張志新(化名)和其女友劉穎瀑梗,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裳扯,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抛丽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饰豺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亿鲜。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冤吨,靈堂內(nèi)的尸體忽然破棺而出蒿柳,到底是詐尸還是另有隱情饶套,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布垒探,位于F島的核電站凤跑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏叛复。R本人自食惡果不足惜仔引,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望褐奥。 院中可真熱鬧咖耘,春花似錦、人聲如沸撬码。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)呜笑。三九已至夫否,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叫胁,已是汗流浹背凰慈。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驼鹅,地道東北人微谓。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像输钩,于是被迫代替她去往敵國(guó)和親豺型。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容