使用 Git 管理 SVN Repository

說了再多 Git 的好處,如果開發團隊依舊繼續使用 SVN 的話,也只能望之興嘆?

Git 最大的特色就是分散式系統,因此可以離線操作,再借助 git-svn 的幫助,我們開發的時候就可以完全的使用 Git,只有在 Check in/out 才需要使用 SVN。以下整理出我個人常用的指令:

Check-out SVN Repository

1. git svn init http://svn/trunk/ProjectName 2. git svn fetch -r REV_NUM 3. git gc

因為 SVN Repository 可能非常龐大,如果不是需要全部的歷史提交資訊,我們可以直接指定從哪版 revision 開始即可。
最後進行垃圾蒐集和壓縮,以減少磁碟佔用空間。

刪除 Branch

git push origin :REMOTE_BRANCH
git branch -D LOCAL_BRANCH
## 修改 Commit 內容
git commit --amend
修改"該次" commit
git commit --amend --date="$(date -R)"
修改後也一起更新 commit 時間

刪除 Commit

  1. git reset –hard COMMIT_HASH
  2. git cherry-pick A B C

先退到要刪除的 commit 前一版,再加入被刪除的 commit 之後的修改。

合併多個 Commit

git rebase -i HEAD~2
合併最新的兩個,執行後會跳出視窗讓你針對各個 Commit 選擇對應的動作,"pick" 最舊(最上方)的,其他直接 squash 即可。

在 Windows 與 Linux 間交互開發

git config --global core.autocrlf true
因為 Windows 的換行字元與 Linux 的不同,所以編輯器可能會跑去 ^M 之類的字元,加入了以上設定之後,我們可以把這轉換工作交由 [Git 替我們完成](http://stackoverflow.com/questions/1967370/git-replacing-lf-with-crlf),如果修改設定後還是會出現 warnings 可以把整個 INDEX 移除( rm .git/index && git reset –hard HEAD )。

其他常用指令:

git branch -av
列出所有 remte/local branches。
git rebase TARGET
相較於 git merge,這個指令更適用於簡單的合併,避免分支圖過於複雜。
git pull --rebase
git pull 與 git fetch 的差別在於 pull 會去 merge 變動,最好改為 git pull –rebase,否則會有冗餘的 auto-merge log。
git log --graph --oneline --all (git config --global color.ui auto)
在文字介面中畫出上色後的樹狀圖。