閱讀170 返回首頁    go 小米 go 小米6


Git 學習筆記

  Git/’ɡɪt/,  Linus的第二個偉大作品。Git這個詞有點兒意思,Linus自嘲說 “I’m an egotistical bastard,  and I name all my projects after myself. First Linux, now Git. “  感歎我生不逢時,錯過了版本控製的“史前黑暗”時代,剛剛接觸版本控製,Linus就站在前邊,笑嘻嘻的說:“版本控製? 什麼是版本控製 。。 ”。真希望Linus身退時,這樣說過:“I’ll be back.” ——施瓦辛格,《終結者》,1984。

     Git這個詞本身很喜感,學Git更歡樂,因為書裏沒啥難懂的知識,看的時候,讓人心花怒放,心想,啥時候看書這麼快了。。寫iMiss時,和東東用Github操作代碼,非常方便,感歎遇上了好時代,一上手就有Git用,還不用給地主家交租,連看書都可以直接跳過像《CVS版本庫到Git的遷徙》這樣的章節。。Git實在是個好東西,它讓你笑,它讓你叫,它讓你跳。

     剛開始用時,遇到過些小麻煩,比如,commit內容寫錯了,merge到了錯誤的分支,最關鍵的是,不知道怎麼用Git畫出優雅的下水道等等。。。後來慢慢知道怎麼解決了,於是,留點筆記吧,既是給自己看的,也是給別人參考的。。

     如果你能看懂下邊這堆命令(純屬瞎折騰),趕緊關掉這個頁麵,遛馬去吧。。
—————————————————————————————————————————————
touch hello.txt
echo "first line in hello.txt" >> hello.txt
cat hello.txt
git add hello.txt
git commit -m "add heo.txt"
git log –oneline
git commit –amend -m "add hello.txt"   //修改最近一次的commit內容
git log –graph –oneline                //圖示查看提交
rm hello.txt                           //從工作區刪除hello.txt
git rm hello.txt                       //從暫存區刪除hello.txt
git commit -m "delete hello.txt"
git reset –mixed HEAD^                 //版本庫和暫存區恢複,工作區刪除
ls                                     //無hello.txt
git ls-files                           //有hello.txt
git ls-tree HEAD                       //有hello.txt
git checkout hello.txt                 //在工作區恢複hello.txt
git reflog
git reset –hard HEAD@{1}               //取消恢複,又刪了

—————————————————————————————————————————————

     後邊提到的,工作區是指(working directory),暫存區是指(staging area,index 在這裏),版本庫是指(git directory,respository,  HEAD在這裏),三者的關係如下圖。標簽是指(tag,也有書裏譯為“裏程碑”)

                                    

Git基礎配置:

配置名字和郵箱:
git config –global user.name "your name"
git config –global user.email "your email"

設置高亮顏色:
git config –global color.ui "auto"      (Linux下)
git config –global color.ui "always"    (Windows下,Windows下Git可以用msysGit)

 

設置文本編輯器:
git config –global core.editor gedit.exe(常用哪個,設置哪個)

PS: 有句老話說的好“你可以把馬帶到水邊……但是你不能強迫它使用你最鍾愛的代碼編輯器。”

設置差異分析工具:
git config –global merge.tool kdiff3    (合並工具有很多種)

 

設置別名:(commit → ci)(可以移植習慣,有人會把Git命令別名為CVS中的相應命令)
git config –global alias.ci "commit"

 

GitHub配置名字和API接口:(故事要從這裏說起)
git config –global github.user username_in_github
git config –global github.token 972b0f310c66a61a0b59f949 (類似的哈希嗎,具體去GitHub看看)

 

檢查上述設置是否成功:
git config –global –list

查看信息相關:

git log:
git log –pretty=oneline                (可以顯示完整哈希碼)
git log –-oneline                      (顯示哈希嗎前7位,上邊的簡化版)
git log –oneline –graph –stat –decorate
這幾個是我常用的參數,更多查看文檔吧:    (git help log)
–oneline:                             單行顯示;
–graph:                               圖示顯示提交曆史;
–stat:                                顯示文件修改曆史;
–decorate                              顯示標簽(Tag);

示例指令:git log –oneline –graph -3

git status -s
示例運行結果: MM hello.txt
第一列字母M,版本庫文件與暫存區文件差異
第二列字母M,工作區文件與暫存區文件差異

 

git reflog
git reflog -5                          查看最近五次的操作記錄,默認是HEAD
git reflog show master –5              查看master最近五次的操作記錄

 

其他查看指令:
ls                                     查看本地文件
cat hello.txt                          查看文件內容
git ls-files                           查看暫存區文件
git ls-tree HEAD                       查看版本庫(HEAD)文件
git ls-remote origin                   查看上遊文件(遠程版本庫)
gitk –all                              圖形界麵查看提交(圖形化界麵)
du -sh .git                            查看版版本庫的大小

添加和刪除:

git add -u     u → update, 以暫存區中有的文件為準, 更新暫存區文件; 如果是工作區新建的文件,則此文件不能添加到暫存區(already tracked files in the index rather than the working tree)

git add .      .代表所有文件,以工作區中有的文件為準,更新暫存區中相應文件; 包括工作區剛剛新建的文件。(update all tracked files in the current directory and its subdirectories.)

git add -A     A → all, 範圍覆蓋(暫存區 + 工作區)中所有文件,所有文件變化都提交到暫存區(包括新建,修改,刪除文件)(files in the working tree in addition to the index.)

rm hello.txt                           從工作區刪除
git rm hello.txt                       從暫存區刪除
git rm –cached <file>                  同上

反悔了:(悔棋,穿越)

git reset
git reset HEAD — <paths>               用版本庫中文件替換掉暫存區中文件夾;
git reset –hard <commit>               版本庫、暫存區、工作區全部一致,撤回到某個commit點;
示例:
git reflog –5                          顯示最近的5條操作記錄
git reset –hard HEAD@{2}               回到HEAD@{2}前的狀態, 即取消最近兩步操作;

   

   來個比較狠的例子,下麵的兩個操作(git reset –hard <commit> 和 git reset –hard HEAD@{<num>}),可以讓你在任意兩個點之間玩穿越,曆史穿梭就是這麼回事兒。。。

$ git log –oneline –3                  //顯示最近的三次commit記錄
10ce10c second line in abc.txt
1fed225 first line in abc.txt
4916146 delete hello.txt
$ git reset –hard 4916146              //從現在(10ce10c)退回到4916146
HEAD is now at 4916146 delete hello.txt
$ git reflog –3                        //查看最近的操作記錄
4916146 HEAD@{0}: reset: moving to 4916146
10ce10c HEAD@{1}: commit:second line in abc.txt
1fed225 HEAD@{2}: commit: first line in abc.txt
$ git reset –hard HEAD@{1}             //撤銷最近的一次操作,即從4916146返回到10ce10c;
HEAD is now at 10ce10c second line in abc.txt

 

git reset –soft <commit>               隻改變版本庫,不改變暫存區和工作區;
示例:
git reset –soft HEAD^                  撤銷剛才的commit,相當於git commit的反操作
git reset –soft HEAD^^                 可以用來合並提交,此時git commit –m “……”可以覆
                                       蓋原來最近兩次的commit內容;

 

git reset –mixed <commit>              改變版本庫和暫存區,不改變工作區;
實例:
git reset –mixed HEAD^                 如果緊跟在git add + git commit後麵執行這條命令,
                                       相當於git add + git commit 的反操作;

 

git reset .                            將git add 命令更新到暫存區的內容撤出暫存區,
                                       即用版本庫的HEAD重置暫存區;
git reset HEAD                         同上;
git reset  filename                    將暫存區中filename撤出暫存區,
                                       相當於git add filename的反操作;
git reset HEAD filename                同上

 

git checkout
git checkout <file> 用暫存區文件替換工作區文件,但並不是git add 的反向操作,因為如果新建一個文件,git add 到暫存區,利用這條命令是無法將將此文件移出暫存區的,試試下麵的代碼:
echo "first line" > abc.txt
git add abc.txt
echo "second line" >> abc.txt
cat abc.txt
git checkout abc.txt
cat abc.txt

 

git checkout .                         會用暫存區內容刷新工作區,相當於取消本地所有修改;
git checkout branch                    檢出到分支,版本庫,暫存區、工作區全部更新;
git checkout branch – filename         用branch中的文件替換暫存區 + 工作區中相應的文件;
git checkout tagname                   HEAD頭指針指向tagname;
git checkout HEAD~1 — welcome.txt      從曆史中恢複文件;

git revert HEAD                        反轉上一條提交,但是會有兩條記錄,上一條記錄 +
                                       新的revert記錄

改變曆史:

git cherry-pick master^                從眾多的提交中挑選出一個提交應用到當前的工作分支中
git rebase –onto <newbase> since till 將(since, till]嫁接到newbase上
示例:git rebase –onto C E^ F 將(E^, F],即[E,F]嫁接到C上
     git cherry-pick <commit>,揀選操作, 將<commit>重新放到當前HEAD上; git rebase可以將連續的幾個<commit>重放到<newbase>上, git rebase 作用上相當於git cherry-pick的加強版,都是為了改變曆史;

git rebase -i C                        交互式變基,手動編輯,可以試試,最方便 + 最強大的
                                       方法,不過要謹慎)

 

標簽:(裏程碑)

git tag
git tag mytag                          創建輕量級標簽
git tag -m "First annoated tag." mytag2創建帶說明的標簽。
git tag -d <tagname>                   刪除本地tag
git push origin mytag                  將mytag共享到上遊版本庫(默認是不共享的)
git push origin:mytag2                 刪除遠程版本庫標簽mytag2

 

比較差異:

git diff
git diff                               比較, 暫存區 Vs. 工作區;
git diff HEAD                          比較, 版本庫 Vs. 工作區;
git diff –cached                       比較, 版本庫 Vs. 暫存區;

忽略文件:

cat > .gitignore << EOF
> *.o
> *.h
> EOF
git add .gitignore
git status –ignored –s                 查看已忽略文件
git add -f hello.h                     強製添加已忽略文件

 

其他一些指令:

git clean –nd                          看看那些文件和目錄會被刪除
git clean –fd                          清除工作區中未加入版本庫的文件&目錄
git stash                              保存當前進度
git blame README                       可以看到每次改變的來源
git mergetool                          利用工具解決衝突
git branch –r                          查看遠程分支
git commit –amend -m "modify last commit content"         
                                       修改上次的提交內容

最後更新:2017-04-03 18:52:08

  上一篇:go svn:could not open the requested svn f 解決
  下一篇:go Android遊戲中添加音頻-詳解MediaPlayer與SoundPoo!並講解兩者的區別和遊戲中的用途!