以下是一些我常用的git命令清單
如果以下的命令不清晰細節,請看git的文檔。
設置個人信息
git config --global user.name "John Doe" git config --global user.email "john@example.com"
使用 --global 那么以上的設置會在所有git工程中生效. 如果 git config 沒有使用 --global 參數並且運行在當前工程目錄下, 那么以上設置只會對當前工程生效。
讓Git忽略文件權限
cd project/ git config core.filemode false
這個選項是讓我們忽略文件權限,也就是文件權限對我們不重要的時候,比如在windows系統下就常用
查看Git的當前配置清單
git config --list
初始化一個git倉庫本地
cd existing-project/ git init
把遠程倉庫克隆到本地
git clone https://github.com/user/repository.git
這個會在本地新創建一個目錄(以遠程倉庫的名稱命名)
查看某個git子命令的幫助文檔
git help clone
Update and merge your current branch with a remote 把遠程的特定分支更新到本地當前的分支,並與本地分支合並
cd repository/ git pull [remote_repo_name] [remote_branch_name]
如果你不想合並,那么就使用git fetch,不要用pull。
查看遠程倉庫的URL
git remote -v
更改遠程倉庫的URL
git remote set-url [remote_repo_name] http//github.com/repo.git
添加個遠程倉庫
git remote add [remote_repo_name] https://github.com/user/repo.git
查看本地文件(沒有添加到暫存區的文件)的變化
git diff
Note that this does not track new files.
查看本地文件(添加到了暫存區但沒有commit的文件)的變化
git diff --cached
查看本地文件相對於遠程倉庫特定分支的變化
git diff [local_repo_name]/[local_branch_name]
比較兩個commit之間的變化
git diff COMMIT1_ID COMMIT2_ID
比較兩個commit之間的變化(僅僅只會列出變化的文件名)
git diff --name-only COMMIT1_ID COMMIT2_ID
查看一個特定commit的文件變化
git diff-tree --no-commit-id --name-only -r COMMIT_ID
or
git show --pretty="format:" --name-only COMMIT_ID
source: http://stackoverflow.com/a/424142/1391963
查看push之前的變化(暫存區與本地倉庫分支的比較)
git diff --cached [repo_name]/[branch_name]
查看一個特定commit的詳情(文本變化,提交信息)
git show COMMIT_ID
查看當前工作目錄的git狀態
git status
普通的更改文件,提交文件
git add changed_file.txt git add folder-with-changed-files/ git commit -m "Commiting changes"
重命名或移動,刪除文件,提交修改
git rm removeme.txt tmp/crap.txt git mv file_oldname.txt file_newname.txt git commit -m "deleting 2 files, renaming 1"
修改最后一個提交的信息(如果最后一個提交的信息有必要修改更正的話)
git commit --amend -m "New commit message"
把本地的commits 推送到遠程倉庫的特定分支
git push [repo_name] [branch_name]
查看最近提交的歷史日志
git log
查看最近2個commits的歷史日志
git log -2
查看最近2個commits的歷史,並進行比較(diff)
git log -p -2
查看最近提交的歷史日志,以單行的形式顯示
git log --pretty=oneline
恢復到一個特定的commit,並提交
git revert [commit_id] git push origin master
恢復到一個特定的commit的狀態
# reset the index to the desired tree
git reset 56e05fced
# move the branch pointer back to the previous HEAD
git reset --soft HEAD@{1}
git commit -m "Revert to 56e05fced"
# Update working copy to reflect the new commit
git reset --hard [commit_id]
Source: http://stackoverflow.com/q/1895059/1391963
撤銷上一個提交,並保留本地變化
git reset --soft HEAD~1
撤銷上一個提交,不保留本地變化
git reset --hard HEAD~1
撤銷上一個提交,在索引中保留本地變化
git reset --mixed HEAD~1
Or git reset HEAD~1
See also http://stackoverflow.com/q/927358/1391963
撤銷本地沒有push的commits
git reset [repo_name]/[branch_name]
把本地的狀態重置為遠程的一個特定狀態
git fetch [repo_name] git reset --hard [repo_name]/[branch_name]
查看本地的分支
git branch
查看所有的分支
git branch -a
創建一個標簽
git tag 7.x-1.3
推送一個標簽
git push [repo_name] 7.x-1.3
創建一個分支
git checkout master git branch new-branch-name
創建一個分支並切換到新分支
git checkout -b new-branch-name
從當前分支的上一個提交創建一個分支(或者說,新分支的base,是當前分支的上一個提交)
git branch branchname
or
git branch branchname HEAD~1 //這里的HEAD~1可以改成特定的commit_id
or
git checkout -b branchname
Source: http://stackoverflow.com/a/2816728/1391963
切換到新分支
git checkout new-branch-name
合並分支
git checkout master git merge branch-name
把branch-name中的所有commit合並到master分支
把branch-name的分支合並到當前分支,並且不合並commits
git merge branch-name --no-commit --no-ff
查看當前分支與其他分支的不同
git diff branch-name
查看當前分支某個特定文件與其他分支的不同
git diff branch-name path/to/file
刪除一個分支
git branch -d new-branch-name
把本地新分支推送到遠程倉庫
git push [repo_name] new-branch-name
得到遠程所有分支
git fetch origin
得到git的根目錄
git rev-parse --show-toplevel
Source: http://stackoverflow.com/q/957928/1391963
從倉庫中刪除所有本地已刪除的文件
git rm $(git ls-files --deleted)
Source: http://stackoverflow.com/a/5147119/1391963
刪除所有沒進入暫存區的文件
git clean -f
包含目錄:
git clean -f -d
防止意外發生:
git clean -n -f -d
Source: http://stackoverflow.com/q/61212/1391963
撤消某個git add的文件:
git reset HEAD file.txt
用git rebase來合並分支:
比如我有一個本地的分支已經推送到了遠程分支,都叫new-ui。 該分支是為了完成新的UI功能,當new-ui分支測試完畢了,需要合並到主分支master,因為想保留new-ui分支上的所有commit歷史信息,不能采用git merge命令,先要把
整個new-ui的分支變基到master分支上來 ,先切換到new-ui分支,然后調用git rebase master這個命令,結果就是這樣整條new-ui提交鏈條就掛到master頭節點的后面了, 變成了 :
----+---------+-----------+------------+
| |
master new-ui
然后git會自動合並,沖突的部分會提示,與傳統的git merge沒有任何區別,然后修改沖突文件,修改完畢后保存,然后git add去除沖突的文件,此時無任何沖突了,可以繼續嘗試rebase了,git rebase --continue 。注意,
如果沒有沖突,直接完整合並,那么是不用git rebase --continue的。這時候可以用git merge合並兩個分支了,先切換到master分支上,然后調用git merge new-ui,結果這時候才會正式把new-ui的代碼合並到master分支上,工作流圖變成了以下:
master
|
----+---------+-----------+------------+
|
new-ui
master指針已經指到尾部了,可以刪除本地的new-ui分支了,git branch -d new-ui
最后刪除遠程new-ui分支:
先查看遠程分支 git branch -r
然后根據遠程分支的名稱刪除遠程分支:
git branch -r -d [remote_repo_name]/new-ui
git push origin :new-ui
用git 遠程倉庫之間的備份:
比如你在github上有一個多次commit的repo,你需要把這個遠程倉庫的所有歷史commit log等版本信息全部備份到公司內網的repo。
需要做以下步驟
git clone [github_repo_url]
然后cd到clone下來的倉庫目錄下
然后運行 git push --mirror [internal_netwrok_repo_url]
