這是本系列學(xué)習(xí)筆記的第二篇
git 學(xué)習(xí)筆記(一)—— 初識(shí) git
前言
本篇文章將簡要的介紹 Git 的一般操作,滿足使用 Git 作為你的版本控制系統(tǒng)的入門級(jí)需求咸产。本文將按工程的一般操作順序進(jìn)行講述盖高。
獲取 Git 倉庫
對(duì)于一個(gè)工程慎陵,一般來說,我們都是從0開始就要進(jìn)行版本控制喻奥。需要我們?cè)谛陆ㄟ@個(gè)工程之初就要添加 git 支持席纽。也有少部分在工程進(jìn)行中添加 git 支持的需求。但是撞蚕,不論你是從何種情景下添加版本控制润梯,都不影響接下來將要進(jìn)行的操作。
又或者甥厦,我們中途加入別人的工程纺铭,則需要克隆(clone)別人的倉庫刀疙。
現(xiàn)有目錄初始化倉庫
對(duì)于第一種情況舶赔,只需要在當(dāng)前目錄下使用
$ git init
該命令會(huì)在當(dāng)前文件夾下生成.git
隱藏子目錄,該目錄包含你初始化的 Git 倉庫中所有的必須文件谦秧,這些文件是 Git 的骨干纠修。這時(shí)候,僅僅做了一些初始化的操作芋齿,項(xiàng)目下所有的文件都還沒有被跟蹤。
克隆現(xiàn)有的倉庫
在第二種情況下缘挑,直接獲得已經(jīng)存在的 Git 倉庫的拷貝,需要使用 clone
命令桶略。
$ git clone https://github.com/libgit2/libgit2
這個(gè)命令會(huì)在當(dāng)前目錄下創(chuàng)建一個(gè)名為“l(fā)ibgit2”的目錄语淘,并在這個(gè)目錄下初始化.git
文件夾,從遠(yuǎn)程倉庫拉取所有的數(shù)據(jù)放入.git
文件夾下删性。當(dāng)前目錄下也將拷貝所有當(dāng)前分支的文件供開發(fā)和使用焕窝。當(dāng)然蹬挺,在克隆遠(yuǎn)程倉庫的時(shí)候,可以自定義本地倉庫的名字:
$ git clone https://github.com/libgit2/libgit2 mylibgit
這將執(zhí)行與上一條命令相同的操作它掂,在本地創(chuàng)建的倉庫名稱則會(huì)變成mylibgit
追蹤你的文件
現(xiàn)在我們有了一個(gè)真實(shí)存在的 Git 倉庫巴帮,可以對(duì)倉庫下的所有文件進(jìn)行修改,完成階段性目標(biāo)之后虐秋,提交這些更新到倉庫中榕茧。
在工作目錄下的每一個(gè)文件不外乎兩種狀態(tài):
* 已跟蹤 已經(jīng)納入版本控制的文件。
* 未跟蹤 除了已跟蹤的文件客给,都屬于未跟蹤文件用押。
所有已跟蹤的文件可能處于未修改,已修改和放入暫存區(qū)三種狀態(tài)靶剑。所有使用 Git 時(shí)文件的生命周期如下:
檢查當(dāng)前文件狀態(tài)
使用git status
命令可以查看當(dāng)前目錄下各個(gè)文件分別處在什么狀態(tài)蜻拨,一般來說,文件會(huì)處在四個(gè)不同的狀態(tài):
狀態(tài)一 clean
當(dāng)你克隆一個(gè)工程下來桩引,整個(gè)文件系統(tǒng)會(huì)處在這個(gè)狀態(tài)
$ git status
On branch master
nothing to commit, working tree clean
狀態(tài)二 untracked
在工程中新建一個(gè)“README.md”文件缎讼,并編輯其中的內(nèi)容,這時(shí)候再查看狀態(tài):
$ echo 'title' > README.md
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
nothing added to commit but untracked files present (use "git add" to track)
狀態(tài)三 staged
新建一個(gè)文件之后坑匠,文件并不會(huì)立即被 Git 追蹤血崭,因?yàn)楹芏辔募覀儾⒉幌M浔话姹究刂啤R虼死遄疲麄€(gè)過程希望我們能夠有所選擇夹纫,使用git add <file>
命令添加你希望的文件進(jìn)入版本控制中,處于staged
狀態(tài)的版本信息设凹,在每個(gè)階段的修改中捷凄,只存在一個(gè)版本。
$ git add README.md
$ git status
On branch master
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md
注意到围来,Git 提示可以使用
$ git rm --cached <file>
將已經(jīng)處于staged
狀態(tài)的文件回退到untracked
狀態(tài)跺涤。
狀態(tài)四 committed
使用commit
命令匈睁,將已經(jīng)暫存起來的更改提交到倉庫中,所有的歷史版本追溯都是以你commit
為基準(zhǔn)進(jìn)行回溯的桶错。區(qū)別于staged
狀態(tài)下的文件航唆,這樣的版本信息是永久的。
$ git commit -m 'first commit'
[master (root-commit) 33e08ff] first commit
1 file changed, 1 insertion(+)
create mode 100644 README.md
$ git status
On branch master
nothing to commit, working tree clean
我知道院刁,細(xì)心的你已經(jīng)發(fā)現(xiàn)糯钙,這個(gè)狀態(tài)和‘狀態(tài)一’根本就沒有區(qū)別嘛。之所以分別列出來退腥,是想重點(diǎn)的強(qiáng)調(diào)一點(diǎn),基于版本控制的整個(gè)文件系統(tǒng)狡刘,每次commit
都是一個(gè)獨(dú)立的版本享潜。在 Git 的歷史版本中都是獨(dú)立并且一視同仁的。
狀態(tài)五 not staged
再次修改“README.md”文件嗅蔬,查看狀態(tài)
$ 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: README.md
no changes added to commit (use "git add" and/or "git commit -a")
not staged
狀態(tài)下剑按,處于staged
狀態(tài)的對(duì)立面,表示進(jìn)行了修改等操作澜术,但是所有的操作沒有被 Git 暫存起來艺蝴,這個(gè)時(shí)候可以使用add
命令將修改暫存,也可以跳過這一步鸟废,直接使用:
$ git commit -a -m 'message'
將所有的修改跳過暫存狀態(tài)猜敢,提交到 Git 倉庫。
提交修改到倉庫
在做協(xié)同開發(fā)的時(shí)候盒延,一般來說會(huì)有一個(gè)遠(yuǎn)程倉庫做大家的同步和備份倉庫使用锣枝。在做好自己的工作之后,提交到本地倉庫之后是不夠的兰英。需要將本地的修改同步到遠(yuǎn)程倉庫撇叁,大家合并各自的部分,才能拼湊成一個(gè)完整的工程畦贸。
合并遠(yuǎn)程倉庫
直接提交本地修改到遠(yuǎn)程倉庫陨闹,很大可能會(huì)由于遠(yuǎn)程倉庫超越本地分支進(jìn)度而被拒絕提交。需要先合并遠(yuǎn)程的修改之后薄坏,解決沖突才能成功提交趋厉。
$ git pull
pull
將遠(yuǎn)程倉庫的所有更新文件獲取下來,解決沖突胶坠。再將文件add
進(jìn)來君账,commit
之后提交。
$ git push origin master