關於git基本使用

git 的一些注意事項

  • 需要說的是git不同於svn,git是分爲本地倉庫遠程倉庫的,我們平常的操作都是通過對本地倉庫完成的
    • 只有需要將本地倉庫的內容push到遠程倉庫或從遠程倉庫更新時 纔會和遠程倉庫發生聯繫
    • 所以不需要象svn那樣時刻都需要有網才能commit,我們可以直接只操作本地倉庫就可以了
    • 同時一個文件的狀態對於git來說是存在於 git的工作目錄 , 暫存區 , 本地倉庫 3個狀態的
    • 我們使用svn或cvs時 只要從工作目錄 commit 到中心倉庫就可以了
    • 但是由於git存在暫存區,所以在git這裏,只有通過add 命令被添加到暫存區的文件,纔可以commit 到本地倉庫.

關於git的安裝

  • 由於大多數人都是windows的系統 所以我們這裏只列出了windows的安裝,其他系統可以自己度娘
    • 可以由http://msysgit.github.io/ 下載相應安裝程序進行安裝 中間的選項默認就好
    • 如果你不使用其他git管理工具,請更改如下操作
      • msysgit的安裝目錄中的etc/git-completion.bash文件增加alias ls='ls --show-control-chars --color=auto'
      • 編輯etc/gitconfig在文件中的[core]部分添加如下部分quotepath = false
      • profile中增加一行 export LESSCHARSET=iso8859
    • 以上3條操作都是爲了防止一些顯示及提交的中文亂碼等問題

關於git的配置

 git config --global user.name "sampson"
 git config --global user.email "[email protected]"
  • 可以通過如上命令添加自己的用戶名及郵箱地址
  • 每次 git 提交時都會引用這兩條信息,說明是誰提交了更新
  • --global 選項說明以後你所有的項目都會默認使用這裏配置的用戶信息
  • 如果要在某個特定的項目中使用其他名字或者郵件,只要去掉--global在當前目錄配置即可,新的設定保存在當前項目的.git/config 文件裏
  • git config --list命令用來查看當前的配置.

關於git的一些基本命令

  • git可以新建一個git項目目錄,也可以從已有的git遠程倉庫中clone一個項目
  • 注意 這不是checkout的概念,checkout在git的世界中是切換分支版本的概念,以後會用到
    • git init 對現有的某個項目目錄開始用 git 管理,命令運行後會生成一個名爲 .git 的目錄,所有 git 需要的數據和資源都存放在這個目錄中.
    • git clone 對已有的遠程倉庫進行clone複製,也會生成 .git目錄
  • git add 把文件加入到前面提到的暫存區
  • git commit 把暫存區中的文件提交到本地倉庫中去
  • git push 把當前本地倉庫的某個分支推送到遠程倉庫中
  • 例如
   git init
    touch README.md
    git add README.md
    git commit -m "first commit"
    git remote add origin ssh://192.168.1.58:10022/doc/gitdoc.git
    git push -u origin master
  • -m 選項爲本次提交的快速註釋方式(沒有提交註釋是不會被git允許的)
  • git remote add 爲添加一個前文提到的遠程倉庫(需要遠程倉庫創建了此裸倉庫)
    • 其中 origin 爲遠程倉庫的別稱,慣例用這個名稱,你也可以根據需要起不同的名字
    • 遠程倉庫用到了ssh的方式需要ssh的key存在於遠程倉庫的管理系統中,在gitlab使用中會進行介紹
    • ssh key參見 gitlab 使用說明
  • push 命令會把剛纔通過init命令新建的本地項目(默認爲master分支) push到遠程倉庫
    • -u 參數是指存在多個遠程倉庫時 指定一個默認主機,這樣後面就可以不加任何參數使用git push
    • 關於push的詳細使用參見git push 的使用
  • 此時 另外一個用戶即可通過 clone 從遠程倉庫下載了
    git clone -c http.sslVerify=false https://192.168.1.58/git/doc/gitdoc.git
    (注意這裏使用了https,意味着push時需要輸入你在網站註冊的用戶名及密碼)
  • 然後我們可以 通過edit --> add --> commit --> push 的方式進行相應的操作
    • 當然我們也可以跳過add ,就是通過選項 –a
    • git 就會自動把所有已經跟蹤過的文件暫存起來一併提交,從而跳過 git add 步驟
      git commit a m 'update xxx'

關於git的分支相關的命令

  • 分支是git的最大魅力,同時實現分支比svn要容易且快速
  • 而合併分支又是svn所不具有的功能
  • git branch sampson 就會在本地新建一個當前項目的samposn分支
    • 我們可以把sampson 想象成windows中的系統還原點,如果我現在什麼都不做
    • 我任何時間切換到sampson這個分支都會對應當前的項目狀態,當然前提是在這個分支上沒有做任何提交
    • branch sampson 並不會切換到sampson分支, 我們需要顯式的使用 git checkoutsampson切換到sampson分支
    • 當然也可以直接使用 git checkout –b sampson 創建並切換到sampson分支
  • git fetch origin 會抓取遠程倉庫 origin 的更新到本地 包括遠程倉庫的各個分支版本
    • 但是注意 fetch並不會把這些更新融合到你的本地倉庫分支中去.
  • git merge origin/master 就是把遠端的master分支 融合到你當前的分支中,如果有衝突 則需要自己解決
  • git pull 命令是指針對遠程倉庫的分支包含了 fetch 與 merge 合二爲一的一個操作
    • 當我們在sampson分支做過一些提交後 我們就可以把這個分支融合到master分支
    • 這裏是從master 融合sampson,如果期間master有提交 那麼就會據此產生一個新的版本
    • 即master所指向的HEAD 指針會向前進一個版本.git 中分支的融合
     git checkout master
     git merge sampson
  • git rebase master 在sampson分支中
  • git rebase master sampson在master分支中
    • huaxj 會尋找自己與master的共同祖先節點
    • 並把基於這個節點之後的所有差異化操作在master版本上重新演繹一遍
    • 然後生成一個HEAD指針在master的下一個版本的節點(同時刪除了自己自共同祖先節點以來的的分支節點)
    • 這個節點是sampson分支的,master並沒有改變,如果需要合併還是需要master merge操作
    • 但是這樣的操作 會使得版本提交的歷史看起來更流暢與線性
    • 還有更重要的一點是在rebase master的過程中,如果有版本衝突,那麼就需要執行rebase的分支進行相應處理
    • 這一點在操作遠程倉庫時尤爲明顯, 先在自己的一個本地分支裏進行開發
    • 當準備向master提交的時候,根據最新的origin/master 進行一次rebase操作後再提交
    • 這樣master維護者就不需要做任何整合工作 直接順利merge
    • 等於你替他把他需要處理的可能出現的衝突都已經先擺平了,誰都會喜歡這樣pull request~
  • rebase --onto master sampson john1
    • 理解方式可以是把 [--onto master] 去掉,即以sampson 和john1的共同祖先rebase john1
    • 但目標結果到master上.有點難以理解,可以自己嘗試下
  • 但是rebase 有個最大的潛在問題就是關係到遠程倉庫的
    • 一定不要把自己已經提交到遠程倉庫的分支rebase掉
    • 原因就是上面提到的rebase會刪除自己同rebase目標分支共同祖先節點以來的的分支節點 然後生成一個新的HEAD節點
    • 所以如果已經提交到遠程倉庫的分支被rebase掉了,很可能有別人已經基於這個分支做了merge以及新的開發
    • 那麼git提交的歷史將變的一片混亂,這種事做出來會人神共憤的
    • 我在haxe openfl小組就遇到過這樣的情況,大家會相當崩潰.....
    • 因爲過於痛苦,所以master版本及一些重要分支都是鎖定的,只有通過pull request 進行處理

關於git的其他命令

  • 沒有提供詳細的說明 自行度娘吧 另外一些可視化git工具都可以做這些命令的處理
  • git rm 命令刪除一個文件,那麼這個文件就會從被跟蹤文件中移除
    • 如果只是手動刪除文件那麼git會認爲這個文件發生了改變但未更新
    • 其實想想 爲什麼有git add 就明白與之對應的要有 git rm 命令了
  • git mv 命令可以進行文件的移動和重命名
  • git log 命令可以查看詳細的提交歷史,並且提供了過濾選項
  • git status 命令可以列出修改過的文件
  • git diff 命令可以查看暫存區與本地目錄文件的區別.
  • git commit –-amend 命令 用於重新提交,處理上一次提交的錯誤
  • git reset HEAD 命令用於取消已暫存的文件
  • git remote –v 可以列出所有的遠程倉庫
  • git remote show origin 可以查看遠程倉庫的信息
  • git remote rename aa bb 會把遠程倉庫名aa 變爲bb
  • git tag 命令會列出所有標籤
  • git tag –l '1.0.*' 會列出對應篩選結果
  • git tag –a v1.0beta –m '1.0 beta' 建立註解標籤
  • git show v1.0beta 可以查看相關信息
  • git push origin v1.0beta 標籤如果想要加入到遠程倉庫同樣需要push
  • git push origin --tags 如果新建了多個標籤,也可以一次推送通過如下命令
  • git reset 版本回退
    • 如果你運行一個 git reset -help 會得到一個比較燒腦的幫助信息
    • 這個說起來…. 好吧 太複雜了,我都沒信心看下去,具體需要的時候再查資料吧
    • 我基本 只會 而且是很少用到
      • git reset --hard commitId 退回某commit 版本
      • git reset --hard HEAD^ (HEAD ^ 就是父節點 ^ ^ 就是父節點的父節點) 你可能會說,我靠 這要是父節點………N回…
      • git reset --hard HEAD~3 就好了
      • git reset --hard HEAD^ check.java 只回退某個文件
      • 以及我以前會最常用的 git reset --hard origin/master

QQ羣:131783959
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章