首先,你須要執行下面兩條命令,做爲 git 的基礎配置,做用是告訴 git 你是誰,你輸入的信息將出如今你建立的提交中。css
git config --global user.name "你的名字或暱稱" git config --global user.email "你的郵箱"
而後在你的須要初始化版本庫的文件夾中執行:html
git init git remote add origin <你的項目地址> //注:項目地址形式爲:http://git.oschina.net/xxx/xxx.git或者 git@git.oschina.net:xxx/xxx.git
這樣就完成了一次版本你的初始化。git
若是你想克隆一個項目,只須要執行:github
git clone <項目地址>
進入你已經初始化好的或者克隆項目的目錄,而後執行:緩存
git pull origin master #從遠程倉庫獲取最新版本併合並<這裏須要修改/添加文件,不然與原文件相比就沒有變更>
git add . git commit -m "這是我第一次提交的說明" git push origin master
而後若是須要帳號密碼的話就輸入帳號密碼,這樣就完成了一次提交。服務器
#顯示當前的Git配置 git config --list #編輯Git配置文件 git config -e [--global] #設置提交代碼時的用戶信息 git config --global user.name "[name]" git config --global user.email "[email address]"
git init # 在當前目錄新建一個Git代碼庫 git init 目錄 # 新建一個目錄,將其初始化爲Git代碼庫
git clone 項目地址URL #拷貝一個Git倉庫到本地
默認狀況下,Git 會按照你提供的 URL 所指示的項目的名稱建立你的本地項目目錄。 一般就是該 URL 最後一個 / 以後的項目名稱。若是你想要一個不同的名字, 你能夠在該命令後加上你想要的名稱。URL也能夠是你的本地倉庫地址,這樣就是建立了一個本地倉庫的克隆版本。網絡
你能夠計劃改動(把它們添加到緩存區),使用以下命令:
git add <filename>
git add *
這是 git 基本工做流程的第一步;yii
# 添加指定文件到暫存區 git add [file1] [file2] ... # 添加指定目錄到暫存區,包括子目錄 git add [dir] # 添加當前目錄的全部文件到暫存區 git add . # 添加每一個變化前,都會要求確認 # 對於同一個文件的多處變化,能夠實現分次提交 git add -p # 刪除工做區文件,而且將此次刪除放入暫存區 git rm [file1] [file2] ... # 把文件從暫存區域移除,但保留在當前工做目錄中 git rm --cached [file] # 若是刪除以前修改過而且已經放到暫存區域的話,則必需要用強制刪除選項 -f git rm -f [file] # 遞歸刪除整個目錄中的全部子目錄和文件 git rm –r * # 更名文件,而且將這個更名放入暫存區 git mv [file-original] [file-renamed]
使用以下命令以實際提交改動:git commit -m "代碼提交信息"
如今,你的改動已經提交到了 HEAD,可是還沒到你的遠端倉庫。ssh
# 提交暫存區到倉庫區,並填寫備註信息 git commit -m [message] # 提交暫存區的指定文件到倉庫區 git commit [file1] [file2] ... -m [message] # 提交工做區自上次commit以後的變化,直接到倉庫區 git commit -a # 提交時顯示全部diff信息 git commit -v # 使用一次新的commit,替代上一次提交 # 若是代碼沒有任何新變化,則用來改寫上一次commit的提交信息 git commit --amend -m [message] # 重作上一次commit,幷包括指定文件的新變化 git commit --amend [file1] [file2] ...
你的改動如今已經在本地倉庫的 HEAD 中了。執行以下命令以將這些改動提交到遠端倉庫:
git push origin master
能夠把 master 換成你想要推送的任何分支。 ide
若是你尚未克隆現有倉庫,並欲將你的倉庫鏈接到某個遠程服務器,你可使用以下命令添加:
git remote add origin <server>
如此你就可以將你的改動推送到所添加的服務器上去了。
# 下載遠程倉庫的全部變更 git fetch [remote] # 查看當前配置有哪些遠程倉庫 git remote -v # 顯示某個遠程倉庫的信息 git remote show [remote] # 增長一個新的遠程倉庫,並命名 git remote add [shortname] [url] # 取回遠程倉庫的變化,並與本地分支合併 git pull [remote] [branch] # 上傳本地指定分支到遠程倉庫 git push [remote] [branch] # 強行推送當前分支到遠程倉庫,即便有衝突 git push [remote] --force # 推送全部分支到遠程倉庫 git push [remote] --all
要更新你的本地倉庫至最新改動,執行:git pull
以在你的工做目錄中 獲取(fetch) 並 合併(merge) 遠端的改動。
要合併其餘分支到你的當前分支(例如 master),執行:git merge <branch>
兩種狀況下,git 都會嘗試去自動合併改動。不幸的是,自動合併並不是次次都能成功,並可能致使 衝突(conflicts)。 這時候就須要你修改這些文件來人肉合併這些 衝突(conflicts) 了。改完以後,你須要執行以下命令以將它們標記爲合併成功:git add <filename>
在合併改動以前,也可使用以下命令查看:git diff <source_branch> <target_branch>
# 列出當前目錄全部尚未被git管理的文件和被git管理且被修改但還未提交(git commit)的文件,-s參數可簡化顯示 git status # 顯示全部提交過的用戶,按提交次數排序 git shortlog -sn # 顯示指定文件是什麼人在什麼時間修改過 git blame [file] # 顯示暫存區和工做區的差別 git diff # 顯示暫存區和上一個commit的差別 git diff --cached [file] # 顯示工做區與當前分支最新commit之間的差別 git diff HEAD # 顯示兩次提交之間的差別 git diff [first-branch]...[second-branch] # 顯示今天你寫了多少行代碼 git diff --shortstat "@{0 day ago}" # 顯示某次提交的元數據和內容變化 git show [commit] # 顯示某次提交發生變化的文件 git show --name-only [commit] # 顯示某次提交時,某個文件的內容 git show [commit]:[filename] # 顯示當前分支的最近幾回提交 git reflog
假如你作錯事,你可使用以下命令替換掉本地改動:
git checkout -- <filename>
此命令會使用 HEAD 中的最新內容替換掉你的工做目錄中的文件。已添加到緩存區的改動,以及新文件,都不受影響。
假如你想要丟棄你全部的本地改動與提交,能夠到服務器上獲取最新的版本並將你本地主分支指向到它:
git fetch origin
git reset --hard origin/master
# 恢復暫存區的指定文件到工做區 git checkout [file] # 恢復某個commit的指定文件到暫存區和工做區 git checkout [commit] [file] # 恢復暫存區的全部文件到工做區 git checkout . # 重置暫存區的指定文件,與上一次commit保持一致,但工做區不變 git reset [file] # 重置暫存區與工做區,與上一次commit保持一致 git reset --hard # 重置當前分支的指針爲指定commit,同時重置暫存區,但工做區不變 git reset [commit] # 重置當前分支的HEAD爲指定commit,同時重置暫存區和工做區,與指定commit一致 git reset --hard [commit] # 重置當前HEAD爲指定commit,但保持暫存區和工做區不變 git reset --keep [commit] # 新建一個commit,用來撤銷指定commit # 後者的全部變化都將被前者抵消,而且應用到當前分支 git revert [commit] # 暫時將未提交的變化移除,稍後再移入 git stash git stash pop
分支是用來將特性開發絕緣開來的。在你建立倉庫的時候,master 是「默認的」。在其餘分支上進行開發,完成後再將它們合併到主分支上。
建立一個叫作「feature_x」的分支,並切換過去:
git checkout -b feature_x
切換回主分支:
git checkout master
再把新建的分支刪掉:
git branch -d feature_x
除非你將分支推送到遠端倉庫,否則該分支就是 不爲他人所見的:
git push origin <branch>
# 列出全部本地分支 git branch # 列出全部遠程分支 git branch -r # 列出全部本地分支和遠程分支 git branch -a # 新建一個分支,但依然停留在當前分支 git branch [branch-name] # 新建一個分支,並切換到該分支 git checkout -b [branch] # 新建一個分支,指向指定commit git branch [branch] [commit] # 新建一個分支,與指定的遠程分支創建追蹤關係 git branch --track [branch] [remote-branch] # 切換到指定分支,並更新工做區 git checkout [branch-name] # 切換到上一個分支 git checkout - # 創建追蹤關係,在現有分支與指定的遠程分支之間 git branch --set-upstream [branch] [remote-branch] # 合併指定分支到當前分支 git merge [branch] # 選擇一個commit,合併進當前分支 git cherry-pick [commit] # 刪除分支 git branch -d [branch-name] # 刪除遠程分支 git push origin --delete [branch-name] git branch -dr [remote/branch]
# 列出歷史提交記錄 git log # 顯示commit歷史,以及每次commit發生變動的文件 git log --stat # 查看歷史記錄的簡潔的版本 git log --oneline # 查看歷史中何時出現了分支、合併 git log --oneline --graph # 逆向顯示全部日誌 git log --reverse --oneline # 查看歷史中何時出現了分支、合併 git log --oneline --graph # 顯示指定文件相關的每一次diff git log -p [file] # 搜索提交歷史,根據關鍵詞 git log -S [keyword] # 顯示某個commit以後的全部變更,每一個commit佔據一行 git log [tag] HEAD --pretty=format:%s # 顯示某個commit以後的全部變更,其"提交說明"必須符合搜索條件 git log [tag] HEAD --grep feature # 顯示某個文件的版本歷史,包括文件更名 git log --follow [file] git whatchanged [file] # 顯示過去5次提交 git log -5 --pretty --oneline # 查找指定用戶的提交日誌,看5條 git log --author=用戶名 --oneline -5 # 查看3周前且在12月12日以後的全部提交,--no-merges 選項以隱藏合併提交 git log --oneline --before={3.weeks.ago} --after={2017-12-12} --no-merges
在軟件發佈時建立標籤,是被推薦的。這是個舊有概念,在 SVN 中也有。能夠執行以下命令以建立一個叫作 1.0.0 的標籤:
git tag 1.0.0 1b2e1d63ff
1b2e1d63ff 是你想要標記的提交 ID 的前 10 位字符。使用以下命令獲取提交 ID:
git log
你也能夠用該提交 ID 的少一些的前幾位,只要它是惟一的。
# 列出全部tag git tag # 新建一個tag在當前commit # -a 選項意爲"建立一個帶註解的標籤"。 不用 -a 選項也能夠執行的,但它不會記錄這標籤是啥時候打的,誰打的,也不會讓你添加個標籤的註解。 我推薦一直建立帶註解的標籤 git tag -a [tag] # 新建一個tag在指定commit git tag [tag] [commit] # 刪除本地tag git tag -d [tag] # 刪除遠程tag git push origin :refs/tags/[tagName] # 查看tag信息 git show [tag] # 提交指定tag git push [remote] [tag] # 提交全部tag git push [remote] --tags # 新建一個分支,指向某個tag git checkout -b [branch] [tag]
Git有commit,爲何還要引入tag?
"請把上週一的那個版本打包發佈,commit號是6a5819e…"
"一串亂七八糟的數字很差找!"
若是換一個辦法:
"請把上週一的那個版本打包發佈,版本號是v1.2"
"好的,按照tag v1.2查找commit就行!"
因此,tag就是一個讓人容易記住的有意義的名字,它跟某個commit綁在一塊兒。
https 方式每次都要輸入密碼,按照以下設置便可輸入一次就不用再手輸入密碼的困擾並且又享受 https 帶來的極速
按照如下設置記住密碼十五分鐘:
git config --global credential.helper cache
若是你想自定義記住的時間,能夠這樣:
git config credential.helper 'cache --timeout=3600' //這裏記住的是一個小時,如需其餘時間,請修改3600爲你想修改的時間,單位是秒
你也能夠設置長期記住密碼:
git config --global credential.helper store
或修改倉庫的地址帶上你的帳號密碼
http://yourname:password@git.oschina.net/name/project.git //注意,當使用郵箱時,請對@符號使用%40替換
若是你本來使用的 ssh 地址想更換成 http(s) 地址,能夠執行如下命令:
//刪除本來的ssh倉庫地址 git remote rm origin //origin 表明你本來ssh地址的倉庫的別名 //新增http地址的倉庫 git remote add origin http://git.oschina.net/username/project.git
先在本地切換到遠程倉庫要回退的分支對應的本地分支,而後本地回退至你須要的版本,而後執行:
git push <倉庫名> <分支名> -f
首先,確認你當前的版本須要回退多少個版本,而後計算出你要回退的版本數量,執行以下命令
git reset HEAD~X //X表明你要回退的版本數量,是數字!!!!
須要注意的是,若是你是合併過度支,那麼被合併分支帶過來的 commit 並不會被計入回退數量中,而是隻計算一個,因此若是須要一次回退多個 commit,不建議使用這種方法
有時候,當發生錯誤修改須要放棄所有修改時,能夠以遠程分支做爲回退點退回到與遠程分支同樣的地方,執行的命令以下
git reset --hard origin/master // origin表明你遠程倉庫的名字,master表明分支名
參考資料: