1. 程式人生 > >git 學習筆記 Git實踐

git 學習筆記 Git實踐

lena 清空 gitconfig 根據 引入 倉庫 git merge 圖片 多個

網上有很多教程,這裏我自己做下整理,省得有時忘記,有道是好記性不如爛博客!

先大概描述下Git的各種命令:

git init #初始化

git clone #將遠程項目拷貝到本地

git add # 提交文件更改(修改和新增)

git commit # 基於當前分支提交修改

git reset # 去除某個提交之後的一切提交記錄

git log # 查看當前分支下的某個提交記錄

git whatchanged # 查看更詳細的提交記錄,可以看到具體哪些文件做了修改

git status # 查看當前狀態

git checkout # 切換分支或者回滾到某個提交

git branch # 創建或查看分支

git merge # 合並目標分支到當前分支

1.Git配置:

Git有三種配置方式,一種是針對全部用戶,一種是針對當前用戶,還有一種是針對當前工程.

1)全部用戶:/etc/gitconfig 通過git config --system進行配置

2)當前用戶:~/.gitconfig 通過git config --global進行配置

3)當前工程:.git/config

同時當前工程的配置會覆蓋當前用戶的配置,當前用戶的配置也會覆蓋全部用戶的配置

我們更多的是針對~/.gitconfig和.git/config進行配置.如可以通過以下命令對當前用戶進行配置:

git config --global user.name "userName"

git config --global user.email "[email protected]"

隨後我們就可以通過vi ~/.gitconfig或git config --global --list進行查看當前用戶的配置

具體配置我們可以通過git help config查看

這裏貼上一段對git顯示的腳本,方便你使用git命令

Shell代碼 技術分享圖片
  1. git config --global color.ui "auto"
  2. git config --global color.diff "auto"
  3. git config --global color.status "auto"
  4. git config --global color.branch "auto"

2.Git對於文件的管理.

對於Git而言,文件只有兩種狀態:untracked和tracked,也就是未跟蹤和已跟蹤.

同時已跟蹤文件又分為三種狀態:

unmodified:文件沒有做過任何修改

modified:文件已經修改了,但還沒有提交

staged:文件已經修改,準備提交

3.Git命令的使用

1)在本地創建Git工程,這裏我把工程創建到/tmp/workspace下,沒有該目錄需先創建.然後Git工程名是git-project

Shell代碼 技術分享圖片
  1. cd /tmp/workspace
  2. mkdir git-project
  3. cd git-project
  4. git init

當看到Initialized empty Git repository in /tmp/workspace/git-project/.git/ 就表示已經創建成功

2)提交更新文件(這裏請註意,這裏的更新包括新增,修改),比如我這裏想新增一個說明文件README.TXT,同時提交到Git倉庫

Shell代碼 技術分享圖片
  1. echo README > README.TXT
  2. git add README.TXT #添加
  3. git commit -m "README" #提交到本地倉庫,並說明是README
  4. git push #如果是要提交到遠程倉庫,則還需要使用該命令

3)有時以下記不得具體對工程做了哪些修改,則可以使用git diff,比如
echo README2 > README.TXT # 先修改README.TXT,以便查看內容變化

git diff

然後控制臺可以看到如下內容:

Shell代碼 技術分享圖片
  1. diff --git a/README.TXT b/README.TXT
  2. index e845566..1a06674 100644
  3. --- a/README.TXT
  4. +++ b/README.TXT
  5. @@ -1 +1 @@
  6. -README
  7. +README2

為了下面的完整性,這裏我再將修改README.TXT給提交上去,可以用一條語句搞定:

git commit -a -m "README2"

4)上面git diff只是對比已經提交了的文件,也就是git tracked的文件的更新情況.如果你新建了一個文件,但沒有提交給git倉庫的話,git diff是跟蹤不到的.這裏我們要使用git status.如下: echo README > README.HTML #新建README.HTML文件 git diff # 看不到有什麽變化 使用git status -s命令後則會看到以下內容: Shell代碼 技術分享圖片
  1. ?? README.HTML

將README.HTML也提交上去

git add README.HTML

git commit -m "create README.HTML"

5) 和git倉庫裏某個文件內容一致,比如你對一個文件做了些修改,但不想要了,想跟倉庫中該文件內容一樣,則

echo README3 > README.TXT # 先修改README.TXT,這裏用cat README.TXT看到的是README3

git checkout -- README.TXT # 同步git倉庫中README.TXT內容,再從README.TXT看到的是README2

可能一次提交了多個文件,但不可能每個文件都git checkout吧.還可以有另外一種方式,通過git log查看你commit的key,再通過git checkout commit_no完成.比如我這裏:

Shell代碼 技術分享圖片
  1. commit 1b5c1689dbfad446fbc29a001fd6498e74bb4427
  2. Author: guoyunsky <[email protected]>
  3. Date: Mon Dec 26 11:52:46 2011 +0800
  4. create README.HTML
  5. commit bc8460c7889aa005f6f056151505c0887c3fd5d5
  6. Author: guoyunsky <[email protected]>
  7. Date: Mon Dec 26 11:48:38 2011 +0800
  8. README2
  9. commit 5c7eeb2b31e5f0722cf2bfc038a51fffcea8dfe1
  10. Author: guoyunsky <[email protected]>
  11. Date: Mon Dec 26 11:48:10 2011 +0800
  12. README

之前是想回滾到README2,它的commit是bc8460c7889aa005f6f056151505c0887c3fd5d5.

所以我們只需git checkout bc8460c7889aa005f6f056151505c0887c3fd5d5
即可.

這個可以隨便切換到任意commit.比如我又想回到README,HTML.

則直接git checkout 1d30434716df7e95a533e20f2973a107eb65b0d1即可

6)GIT 回退 GIT checkout

通過上面git log可以看出git checkout後git倉庫中並不會發生變化,包括索引文件和源碼.所以這裏引入git reset.

比如我這裏就只要README這個提交下的源碼,README之後的所有修改都是無效的.這也意味著Git倉庫中README這個提交是最新.所以需要刪除掉README2和create README.html的commit.這裏就可以使用git reset了.具體命令如下:

git reset --hard 571d6fac5b8218b40953e478dbb28e41c5511904

同時本地的代碼也是README狀態!所以這個可是要慎用!因為不僅git倉庫沒有了相關索引文件和源碼,連你本地的源碼也被清除,只有README狀態下的源碼.你可以用git log查看下,發現只有README這個提交了

有時我們有這樣一種需求,比如想取消某一次提交,但不想修改本地代碼,只是不想在git倉庫中提交.我們也可以使用git reset.如我想取消最近一次提交,則可以

git reset --soft HEAD~1

那麽你上一次提交就不會反應到Git倉庫中去了.

這裏介紹下git reset:

git reset HEAD filename #從暫存區中刪除文件

git reset –hard HEAD~3 #會將最新的3次提交全部清空,那麽倉庫中最新的代碼應該是HEAD~4,之前三次提交全部沒了
git reset –hard commit bc8460c7889aa005f6f056151505c0887c3fd5d5 #回退到bc8460c7889aa005f6f056151505c0887c3fd5d5 版本

git reset –mixed #此為默認方式,不帶任何參數的git reset,回退到某個版本,只保留源碼,回退commit和index信息
git reset –soft #回退到某個版本,只回退了commit的信息,不會恢復到index file。如果還要提交,直接commit即可
git reset –hard #徹底回退到某個版本,本地的源碼也會變為上一個版本的內容

7)修改文件名,這裏不在是修改文件內容.修改文件名的話,比如這裏修改README.TXT為readme.txt,對於Git來說,是刪除了README.TXT新增了readme.txt文件.我們可以通過git status來查看

Shell代碼 技術分享圖片
  1. # On branch master
  2. # Changes not staged for commit:
  3. # (use "git add/rm <file>..." to update what will be committed)
  4. # (use "git checkout -- <file>..." to discard changes in working directory)
  5. #
  6. # deleted: README.TXT
  7. #
  8. # Untracked files:
  9. # (use "git add <file>..." to include in what will be committed)
  10. #
  11. # readme.txt
  12. no changes added to commit (use "git add" and/or "git commit -a")

但Git不可能這樣弱智,可以使用git mv README.TXT readme.txt,如發生錯誤可以視情況強制執行:git mv -f README.TXT readme.txt,再通過git status查看:

Shell代碼 技術分享圖片
  1. # On branch master
  2. # Changes to be committed:
  3. # (use "git reset HEAD <file>..." to unstage)
  4. #
  5. # renamed: README.TXT -> readme.txt
  6. #

8) Git刪除文件

git rm HEADME.TXT

git commit -m "delete README.TX

以上會在git倉庫中刪除README.TXT,同時以後也不會再跟蹤這個文件.如你輸入git diff則不會再拿這個文件去對比.但有時我們只想刪除跟蹤這個文件,但還想在git倉庫中保留這個文件.則可以使用這個命令:

git rm --cached README.TXT

9)Git分支 git branch

分支是個永恒的概念,比如很多開源程序都有版本以及不同的功能實現.如Hadoop被用到各個方面.

git branch branch_name #創建分支

git branch -r #查看遠程分支,也就是你git倉庫裏有哪些分支

git branch -a # 查看所有分支,遠程和本地

git branch --no-merge # 查看所有未合並的分支

git branch --merge # 查看所有已合並的分支

git checkout branch_name # 切換到某個分支

git checkout -b branch_name # 創建並且切換到某個分支

git branch -d branch_name # 刪除某個分支,僅能刪除合並了的分支

git branch -D branch_name # 刪除某個分支,未能合並的分支也能刪除

git merge dest_branch # 將目標分支合並到你當前分支

以上只是命令,這裏來個實踐.我們重新建個git工程.也算是對git有個大概的使用

#創建git工程

mkdir git-branch-test

cd git-branch-test

git init

echo "test" > test.txt

git add test.txt

git commit -m "test" #提交到master分支

git checkout -b test #創建並進入test分支

echo "test2" >> test.txt #追加文件內容到test.txt,如此test分支中test.txt文件內容已修改

git add test.txt

git commit -m "test2" #提交到test分支

git checkout master #切換到master分支

echo "test3" >> test.txt #追加內容到test.txt,如此master分支中test.txt文件內容又有修改

git add test.txt

git commit -m "test3" #提交到master分支

經過以上命令,我們知道master分支中提交過兩次,test.txt文件內容是test test3.而test分支也同樣提交過兩次,內容是test test2.這裏我們將test分支合並到master中:

git checkout master

git merge test

之後再跟test.txt文件內容為如下:

Shell代碼 技術分享圖片
  1. test
  2. <<<<<<< HEAD
  3. test3
  4. =======
  5. test2
  6. >>>>>>> test

可以看到合並之後有沖突,那需要我們根據實際情況處理.

git 學習筆記 Git實踐