2011
Dec
30

Git 是一個很好用的程式碼版本管理工具,不管是前端,後端工程師,都應該要學會 Git 。

安裝 Git

  • Ubuntu: sudo apt-get install git
  • CentOS, RedHat : sudo yum install git

GitHub設定

接著去 GitHub 申請帳號,並 create Repository ,然後按照網站給的教學來設定吧!!

  • git config --global user.name "Your Name"
  • git config --global user.email [email protected]
  • 建立 private/public key : 就是建立一對密碼,把 private 存到自已電腦的 /home/name/.ssh/id_rsa , 另外一個 public key 存到 github。
    • 建立key方式 : ssh-keygen -t rsa -C "xxxm"
    • 測試進線 ssh -T [email protected] : 若收到訊息「Hi xxxx! You've successfully authenticated, but GitHub does not provide shell access.」這樣就算成功囉。
  • 接著回到你要管理的程式目錄
  • git init : 初始化 git,git 會自動建立資料夾 .git/ ,之後的檔案是否有更新,都會從這邊去比對。

再來還是跟著網站說明,上傳一個 README 檔案

  • touch README :建立 README
  • git add README : 將 README 增入至 git
  • git commit -m 'first commit' : commit 至 local git
  • git remote add origin [email protected]:xxxx/MyProgram.git 指定我要 commit 到 github server 路徑,以及設定一個 Local branch -> origin
  • git push -u origin master : commit local branch origin 到遠端的 master
  • 最後回到 GitHub 網站點一下 continue 就完工囉

clone 一份全新的 branch 回來

如何取消尚未 commit 的 code

在 GIT 中要取消修改,不像 svn 這麼簡單,以前用 svn 都會直接 rm 刪除檔案,然後再重新執行 svn update ,但是在 git 中,如果你直接用 rm 刪除檔案, git 會認定你不要這個檔案了,然後就會出現 deleted file 的狀態。

取消方式是,先用 git status 來檢查有那個檔案被修改過。

Example
  1. # On branch master
  2. # Changes not staged for commit:
  3. # (use "git add <file>..." to update what will be committed)
  4. # (use "git checkout -- <file>..." to discard changes in working directory)
  5. #
  6. # modified: xxx.php

再來使用 git checkout 取消這次的修改,注意指令中間要多加 -- 的符號,如果你要回復到特定的版號,那麼就要補上 vesrion 。

git checkout -- xxx.php
git checkout (version) xxx.php

如果要取消全部的檔案,可以使用下面這句語法,將全部的修改取消掉。

git checkout $(git ls-files --modified)

回復 commit 的 code

先輸入 git log 看看目前 commit 的進度,然後選擇你要回復的 log id ,最後使用 git revert 將程式回復。

  • git revert 508bbac0f9f92b971xxxf852c1bb7191d7a62722

如果你已經將 code , add 並 commit 到 local repository ,這時你可以用 git reset 的方式,將程式還原。

  • git reset --hard 3d5575f8e4c97ddab8ad5d540fee4664c04db75d

碰到 git auto merged files 有 conflict 時,如果不想處理 conflict,也可以直接用 reset 的方式還原,但要注意你剛剛所修改的程式就不見囉。

GIT merge error “commit is not possible because you have unmerged files”

Merge 其他人的 commit code 回來測試

Github 有一個不錯的功能,就是每個人都能 Fork 一份最新的 code 回去修改,比如現在有 A ,B 兩個人,各有一個 Code Branch , 當 A 修改了一部分 Code 之後, B 可以直接將 A 修改的部分拉回來自已的 Branch 做 Merge,然後等到 B 也測試完畢,再 commit 到 master branch, Merge 的方式是使用 Pull

其它指令

  • git remote update : 更新本地端的檔案
  • git remote rm origin : 刪除本地端 branch origin
  • git diff : 將新改的檔案與本地端的 branch 做 diff
  • git diff origin/master: 與 github 上的 code 做 diff
  • git branch : 查看目前有多少個 branch

Git Sub Module

Git 還有一個 Sub Module 的功能,這是指一個 Git Project 中用到了第三方的 Git Source Code ,我們可不想把第三方的程式上傳到我們的 Git Project,這時你可以使用,submodule 的方式,將第三方程式碼下載回來。

增加一個 Sub Module


Git clone 時,連Sub Module 也一併下載

  • git clone --recursive git://github.com/user/myProject.git

更新 Sub Module

  • git submodule update --init --recursive

Git conflict

Please, commit your changes or stash them before you can merge. git
  • git stash
  • git pull
  • git stash pop

diff 本機已 commit 的程式和 git server 上的程式。

  • git diff HEAD origin/master
  • git log -p -3 (查詢 commit log)

Pull Remote Branch

我 Local 端的 code = [email protected]:myname/source.git (master)

branch 操作

  • 刪除遠端 branch : git push origin --delete dev
  • 刪除本地端 branch : git branch -d xxbranch
  • 切換 branch: git checkout xxxbranch

清除 git .log

當 git 越用越久,git log 的資料會越來越大,最後造成 git clone 的時間會很長,這時可以用以下指令清除沒用的 log

Example
  1. git reflog expire --expire=now --all
  2. git gc --aggressive --prune=now
  3.  
  4. git push origin master --force

如何自已當一個 git server

git 的程式,本身就內建可以當一個 git server ,所以你不用額外安裝其它的程式。

首先我們在 server 上先建立一個新的 repository。

  • cd /repository/
  • git init --bare new_repo

接著回到開發目錄,隨便寫一個 README 檔,然後用類似在 github 上的指令,將檔案 push 到我們自已的伺服器。

  • cd /xxx/xx/new_repo
  • touch README
  • git init
  • git add README
  • git commit -m "initial commit"
  • git remote add origin account@host:/repository/new_repo
  • git push origin master

做完之後,再檢查 /repository/new_repo 是不是多了一個 README 的檔案呢。


回應 (Leave a comment)