git簡介、基本命令和倉庫操作


Git(讀音為/gɪt/)是一個開源的分布式版本控制系統,可以有效、高速地處理從很小到非常大的項目版本管理。Git 是Linus Torvalds為了幫助管理Linux內核開發而開發的一個開放源碼的版本控制軟件。Torvalds開始着手開發Git是為了作為一種過渡方案來替代BitKeeper。
開發過程如下圖所示:

Git的功能特性:
從一般開發者的角度來看,git有以下功能:
1、從服務器上克隆完整的Git倉庫(包括代碼和版本信息)到單機上。
2、在自己的機器上根據不同的開發目的,創建分支,修改代碼。
3、在單機上自己創建的分支上提交代碼。
4、在單機上合並分支。
5、把服務器上最新版的代碼fetch下來,然后跟自己的主分支合並。
6、生成補丁(patch),把補丁發送給主開發者。
7、看主開發者的反饋,如果主開發者發現兩個一般開發者之間有沖突(他們之間可以合作解決的沖突),就會要求他們先解決沖突,然后再由其中一個人提交。如果主開發者可以自己解決,或者沒有沖突,就通過。
8、一般開發者之間解決沖突的方法,開發者之間可以使用pull 命令解決沖突,解決完沖突之后再向主開發者提交補丁。

從主開發者的角度(假設主開發者不用開發代碼)看,git有以下功能:
1、查看郵件或者通過其它方式查看一般開發者的提交狀態。
2、打上補丁,解決沖突(可以自己解決,也可以要求開發者之間解決以后再重新提交,如果是開源項目,還要決定哪些補丁有用,哪些不用)。
3、向公共服務器提交結果,然后通知所有開發人員。

優點:
1、適合分布式開發,強調個體;
2、公共服務器壓力和數據量都不會太大;
3、速度快、靈活;
4、任意兩個開發者之間可以很容易的解決沖突;
5、離線工作。

缺點:
1、資料少(起碼中文資料很少);
2、學習周期相對而言比較長;
3、不符合常規思維;
4、代碼保密性差,一旦開發者把整個庫克隆下來就可以完全公開所有代碼和版本信息。

git基本命令:

  1. git init 表示初始化一個Git倉庫。
  2. git status 表示查看當前倉庫的狀態,可以隨時掌握工作區的狀態,例如可以看到有哪些文件被修改了,有哪些文件需要提交等,如果沒有的話就會出現 working tree clean表示工作區很干凈,沒有被修改的文件或者沒有需要提交的文件,如果有文件被修改了,可以結合git diff filename查看文件被修改了什么內容,也就是文件發什么了哪些變化。
  3. git add filename 表示將文件添加到暫存區。
    add可以反復多次使用,將多個文件添加到暫存區。如果一次性添加多個文件,直接使用空格分隔文件名就可以了。
  4. git commit filename 表示將文件提交到倉庫,有說明信息需要使用-m參數,變為這樣:git commit -m "說明信息" filename。
    這兒提交可以不用接文件名的,因為add到了暫存區,提交就是提交暫存區的內容,如果add了多個文件到暫存區,那么commit時不加文件名就表示將暫存區的文件全部提交,添加了文件表示只提交指定的那個文件。
    git commit --amend命令可以重新修改提交信息。例如你之前提交了文件,但是你的描述信息寫錯了,這時可以使用它來重新修改提交信息,但是內容是沒有變化的。
  5. git diff filename 表示比較文件的不同地方,比如昨天修改了文件,但是今天已經不記得了修改了什么,這時可以使用這個命令查看今天的文件和昨天的文件有什么不一樣。
    必須在沒有add進暫存區之前進行比較,如果已經添加進暫存區之后將無法比較出區別。
    例如:

    a/A.txt表示之前的文件,b/A.txt表示之后的,-號表示刪除了內容,+號表示添加了內容並且可以看到添加了什么內容。
  6. git log 命令可以查看從最遠到最近的提交日志,git log --pretty=oneline表示提交日志在一行顯示,不然的話太亂了不方便瀏覽。
    git log -1命令可以查最后一次提交的信息,后面可以-n,表示可以查看最近幾次的提交情況。
    git log -p -2 命令還可以查看每次提交的差異變化,也就是說查看每次提交文件的變化內容,這里表示查看最近兩次提交所發生的變化。
    git log --stat命令可以查看每次提交的一些簡略信息,比如那些文件被修改了,最后會有一句總結,表示有多少個文件被修改,增加了或者刪除了。
    git log 還可以和--graph結合使用,顯示 ASCII 圖形表示的分支合並歷史。
    git log --pretty 可以指定提交日志的顯示格式,有oneline,short,full,fuller可以選擇。還可以設置format,
    它的常用選項是:例如git log --pretty=format:"%h - %an, %ar : %s"
    Table 1. git log --pretty=format 常用的選項
    選項 說明
    %H 提交對象(commit)的完整哈希字串
    %h 提交對象的簡短哈希字串
    %T 樹對象(tree)的完整哈希字串
    %t 樹對象的簡短哈希字串
    %P 父對象(parent)的完整哈希字串
    %p 父對象的簡短哈希字串
    %an 作者(author)的名字
    %ae 作者的電子郵件地址
    %ad 作者修訂日期(可以用 --date= 選項定制格式)
    %ar 作者修訂日期,按多久以前的方式顯示
    %cn 提交者(committer)的名字
    %ce 提交者的電子郵件地址
    %cd 提交日期
    %cr 提交日期,按多久以前的方式顯示
    %s 提交說明
    例如:
    有時候當我們修改了文件,但是想要恢復以前的某一個版本的文件,可以采用創建一個快照的形式方便回退到以前的某一個版本,在git中的快照就是commit。
    圖片中黃色的那一長串就是commit id。
    當你想要回退到某一個版本的話,首先必須知道當前是在哪個版本,而在git中HEAD就表示當前版本,head就是一個類似指針,指向當前版本。上一個版本表示為HEAD^,上上個版本表示為HEAD^^,如果版本太多了,可以直接這樣表示某一個版本HEAD~10,表示之前的第10個版本。
  7. git reset --hard HEAD^ 命令表示回退到上一個版本。現在已經回退到上一個版本了。
    但是如果你后悔了,還是想要以前的剛剛你修改的那個版本,怎么辦,這時只要你的git bash 窗口沒有關閉,你可以往上翻找你剛剛commit 的commit id然后
    git reset --hard commit id 就可以回退到之前你剛剛的那個版本了。
    在如果,第二天你又后悔了昨天的操作,那么現在還是可以找到你之前的版本的,我擦,git好神奇哦
    git 使用了一個git reflog 來記錄你的每一次命令操作的。

    圖片中黃色的那一串就是commit id,這時 git reset --hard commit id就可恢復了。

需要注意的是git是分布式版本控制工具,它是有一個暫存區概念的,每一次修改了需要add到暫存區然后在commit提交,如果修改了直接提交的話,是不會成功的,因為提交只會提交暫存區中有的修改。可以使用git diff HEAD -- filename 來查看工作區和版本庫里面最新版本的區別。


那么如何撤銷已經修改了的文件呢?有兩種情況:第一,修改了文件,但是還沒有add進暫存區;第二,修改了並且已經添加進了暫存區。

第一種情況,修改了還沒有add進暫存區可以使用git checkout -- testzancunq.txt進行撤銷工作區的修改,這樣就回到了原來工作區內容的狀態。
第二種情況,修改了並且已經添加進暫存區了,如下圖:

這時可以使用git reset HEAD testzancunq.txt表示從暫存區中取消暫存,然后在使用git checkout -- testzancunq.txt進行撤銷,完事!
8. 刪除文件,在git中刪除文件也是一種修改。
當你使用rm刪除了文件之后,使用git status查看工作區狀態如下圖:

這個時候你可以恢復,但是如果你確定要刪除文件,可以使用git rm filename 並且commit到git倉庫中,這時文件就從版本庫中刪除了,也就是無法恢復了。
另一種情況是你刪錯了文件,在刪除文件之前只要你將文件提交到了版本庫中,都是可以恢復的,但是只能恢復到最新版本,會丟失最近一次提交后你修改的內容。
git checkout其實是用版本庫里的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。
9. 當你不知道某個命令的作用時可以查看git 幫助文檔,有三種方式:
git help verb
git verb --help
man git-verb
git help config 獲取config手冊


以上就是git在本地庫中的文件的基本操作。


接下來是如何向遠程倉庫提交內容。這時需要注冊一個github賬號,並且github是基於SSH協議加密授權的,ssh是一種網絡協議用於計算機之間的加密登錄,就像遠程操作服務器一樣,例如linux,可以利用ssh遠程連接操作服務器。每一台linux都配置了ssh協議。想要向遠程倉庫提交代碼,需要ssh key,需要在github中添加ssh key。首先要生成ssh key。

  1. ssh-keygen -t rsa -C "youremail@example.com"(郵箱要換成自己的郵箱) 表示使用rsa算法生成密鑰,最后windows平台會在用戶目錄下生成.ssh的隱藏目錄,以及id_rsa和id_rsa.pub兩個文件,而id_rsa就是密鑰,id_rsa.pub就是公鑰。這樣只需要將公鑰id_rsa.pub添加到github中,就可以和本地的密鑰id_rsa進行配對,完成授權過后就可以進行代碼提交了。
    添加成功過后進行測試:ssh -T git@github.com,如果出現了Hi.....就表示授權添加成功了。
  2. Push命令:表示如果本地代碼有更新了,就可以將它推送到遠程倉庫,以保持代碼同步,例如:git push origin master表示將本地代碼推送到master分支。
  3. Pull命令:表示將遠程倉庫的代碼更新到本地,例如:git pull origin master 表示將遠程master的代碼拉到本地。
    有了Push和pull兩個命令就可以向遠程倉庫提交代碼了。如果有改動就添加到暫存區,沒有問題就可以commit,最后將項目push到遠程倉庫。
    向遠程倉庫提交內容有兩種方式,一種是將項目從遠程倉庫clone下來,另一種是將本地倉庫與遠程倉庫進行關聯。

第一種方式,將項目從遠程倉庫中clone下來

  1. git clone git@github.com:github名稱/項目倉庫。表示將項目從遠程clone到本地。這個項目本身就是一個git倉庫了,所以就不需要再進行git init了。
  2. git push origin master 表示如果修改了文件,並且commit了,就直接將項目推送到遠程倉庫了。

第二種方式,將本地倉庫和遠程倉庫關聯起來,

例如本地倉庫test2,遠程倉庫test,現在需要將test2中的代碼提交到test中。這個時候需要將test和test2關聯起來。

  1. git remote add origin git@github.com:github名稱/項目.git 表示將本地倉庫和遠程倉庫關聯起來,這個遠程倉庫的地址是git@github.com:github名稱/項目.git,而origin是這個倉庫的名字,以后推送就可以使用git push origin master表示推送到遠程倉庫origin的master分支。
  2. git push -u origin master表示向test倉庫提交了代碼,默認是提交到master主分支上。第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以后的推送或者拉取時就可以簡化命令。

參考文章:
(1) https://baike.baidu.com/item/GIT/12647237?fr=aladdin#7


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM