一、刷新遠程分支,查看如今都有哪些分支存在 命令:git remote update origin --prunelinux
二、切換分支:git checkout 分支名git
三、建立並切換分支:git checkout -b 分支名github
四、查看分支:git branchweb
五、查看全部分支:git branch -a數據庫
六、克隆指定分支代碼:git clone -b 分支名 倉庫地址ruby
七、推送分支,就是把該分支上的全部本地提交推送到遠程庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠程庫對應的遠程分支上:bash
$ git push origin master
若是要推送其餘分支,好比dev
,就改爲:app
$ git push origin dev
明確一些git中的概念工具
-) git版本管理工具中四個區域概念: (1)Workspace:工做區 (2)Stage:暫存區 (3)Repository:倉庫區(或本地倉庫) (4)Remote:遠程倉庫 其中工做區和暫存區在各個不一樣的分支中是共享的(方便理解stash操做) -)git中一些單詞的大概意思 (1) HEAD 表示當前版本,上一個版本就是HEAD^(能夠寫爲HEAD~1),上上一個版本就是HEAD^^^^^(能夠寫爲HEAD~5), -) git中文件狀態 (1) untracked:新建的文件,沒有git add [filename] 的都屬於未被git追蹤到文件 (2) 未加入到暫存區的文件: 指的是已經被追蹤(tracked)過,可是沒有加入到暫存區(已經執行過git add的可是此次修改後尚未git add) -)遠程庫 (1) origin : git給遠程庫起的默認名稱是origin
git initfetch
git init 初始化git倉庫 git init [program-name] 新建一個目錄,將其初始化爲Git代碼庫
git clone(默認 : clone下來的版本只能看到master分支, 若是,想要在dev分支上開發,就必須建立遠程 origin的dev分支到本地)
git clone git@github.com:yanqiangsjz/website.git 將遠程倉庫克隆到本地開發(多人協做開發) git checkout -b [branch] [remote]/[branch] (建立遠程[remote]的[branch]分支到本地。 通常遠程倉庫和本地倉庫分支命名同樣)
git config (--global參數是全局參數,也就是這些命令在這臺電腦的全部Git倉庫下都有用。 若是不加,那隻針對當前的倉庫起做用。)
git config --list 顯示當前的Git配置 git config user.name 查看用戶名 git config user.email git config --global user.name [username] 設置全局用戶名 git config --global user.email [email] git config --global color.ui true 配置Git顯示顏色
git add
git add [filename] 添加指定文件到暫存區(表示添加新文件和編輯過的文件不包括刪除的文件) git add [dir] 添加指定目錄到暫存區,包括子目錄 git add . 添加當前目錄的全部文件到暫存區(表示添加新文件和編輯過的文件不包括刪除的文件) git add -u 表示添加編輯或者刪除的文件,不包括新添加的文件
git rm filename
git rm [filename] 刪除工做區文件並放進暫存區 若是想從暫存區撤銷:git reset HEAD -- [filename] 若是想撤銷工做區的修改:git checkout -- [filename] 注意區別 : rm [filename] 刪除工做區文件, 並無放進暫存區 若是想撤銷工做區的修改:git checkout -- [filename] git rm --cached [filename] 中止追蹤文件,但該文件會保留在工做區(untracked狀態)
git diff
git diff [filename] 比較的是工做區文件與暫存區文件的差別 git diff --cached [filenam] 比較的是暫存區的文件與上一個commit的差別 git diff HEAD -- [filename] 比較的是工做區與當前分支最新commit之間的差別
git status
git status 查看文件狀態; 還能夠在分支合併衝突的時候提示哪一個文件衝突
git commit
git commit -m [message] 暫存區提交到倉庫區 git commit [filename1] [filename2] ... -m [message] 暫存區的指定文件提交到倉庫區 git commit -a -m [message] 工做區中修改後,還未使用git add . 命令添加到暫存區中的文件也一併提交上去 至關於git add . 與git commit –m [message] 兩句操做合併爲一句進行使用。commit完成事後,git status, 下方的工做區是乾淨的
git log
git log 查看當前分支的版本歷史 git log --stat 查看commit歷史,以及每次commit發生變動的文件 git log --pretty=oneline 查看從最近到最遠的提交日誌簡單日誌(--pretty=oneline:單行模式) git log -1 查看最近一次的提交信息 git log -n 查看最近n次的提交信息 git log --graph 查看分支合併圖 git log --graph --pretty=oneline 查看分支合併圖;簡單日誌 git reflog 查看命令歷史,以便肯定要回到將來的哪一個版本
git blame
git blame [filename] 查看指定文件是什麼人在什麼時間修改過
git shortlog
git shortlog -sn 查看全部提交過的用戶,按提交次數排序
git show
git show [commit] 顯示某次提交時,文件變化 git show [commit]:[filename] 顯示某次提交時,某個文件的內容(注意[commit]:[filename]冒號之間沒有空格)
git checkout (1)
git checkout -- [filename] 工做區filename的修改撤銷 git checkout . 撤銷工做區的所有修改 解釋 :一種是文件修改後尚未被放到暫存區,如今,撤銷修改就回到和版本庫如出一轍的狀態; 一種是文件已經添加到暫存區後,又做了修改,如今,撤銷修改就回到添加到暫存區後的狀態。 總之,就是讓這個文件回到最近一次git commit或git add時的狀態。
git checkout (2)
git checkout [branch] 切換分支 git checkout -b [branch] 建立並切換到該分支(若是在切換分支的時候,未commit, 有可能會報錯)
git checkout (3)
git checkout -b [branch] [remote]/[branch] 說明: 多人協做時,若是同事從遠程庫clone時,默認狀況下,你的同事只能看到本地的master分支。若是,你的同事要在([branch])分支上開發, 就必須建立遠程([remote])的([branch])到本地
git reset (1)
git reset [filename] 重置暫存區的指定文件,與上一次commit保持一致,工做區不變 git reset --hard 重置暫存區與工做區,與上一次commit保持一致 git reset --hard HEAD~2 回退到某個版本(這裏是從當前版本回退兩個版本) git reset --hard commitID 回退到某個版本(commitID是版本號)
git reset (2)
git reset HEAD -- [filename] 把暫存區的修改撤銷(unstage),從新放回工做區
git branch 分支名稱
git branch [branch] 建立分支 git branch 列出全部本地分支 git branch -a 列出全部本地分支和遠程分支 git branch -r 列出全部遠程分支 git branch -d [branch] 刪除分支 git branch -D [branch] 強制刪除一個尚未合併(已經commit)的分支 說明: 一、若是一個分支在開發完成之後(分支已經commit)待合併,若是出於某種緣由這個分支廢棄了,可是這個分支必須刪除。git branch -D [branch] 二、若是一個分支尚未commit, 是可使用 git branch -d [branch]
git merge (merge以前必須都先commit,即工做區和暫存區使用git status 應該是乾淨的工做區域,便是已是最新的commit)
git merge [branch] 合併指定分支([branch])到當前分支 git merge --no-ff -m [message] [branch] 合併指定分支([branch])到當前分支,禁用Fast forward模式 解釋 : 禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就能夠看出分支信息。 必要 : 若是merge出現衝突, 則解決衝突之後必須:一、git add 二、git commit。 建議 : (1 解決完成衝突之後,最好直接將分支刪除,若是須要,再新建一條分支。緣由是在解決衝突了之後,若是還切換回以前的分支繼續開發, 分支仍是衝突發生前的內容(解決衝突只解決的主分支master的(並且衝突解決不是所有按照分支內容解決的)因此再次提交會報錯。 (2 若是合併衝突徹底放棄原來主分支的衝突採用dev分支的內容,則合併後主分支的內容和現存在dev分支是同樣的內容,不刪除原來的分 支繼續在上面開發也是能夠的 衝突斷定機制 : 先尋找兩個commit的公共祖先,比較同一個文件分別在ours和theirs下對於公共祖先的差別,而後合併這兩組差別若是 雙方同時修改了一處地方且修改內容不一樣,就斷定爲合併衝突,依次輸出雙方修改的內容 分支策略 : 首先,master分支應該是很是穩定的,也就是僅用來發布新版本,平時不能在上面幹活;那在哪幹活呢?幹活都在dev分支上, 也就是說,dev分支是不穩定的,到某個時候,好比1.0版本發佈時,再把dev分支合併到master上,在master分支發佈1.0版本;每一個人 都在dev分支上幹活,每一個人都有本身的分支,時不時地往dev分支上合併就能夠了。 補充建議 : 若是在dev分支上正在開發一個功能,可是這是master上須要解決一個bug,這時須要切換回master在開發出一個bug分支 來解決 這個bug,可是在dev分支上功能尚未開發完,不能commit。這時解決辦法是:第一步、將dev分支上的工做現場 ‘封存’起來(git stash) 第二步、 切換到主分支,新建主分支的bug分支,將bug修改完而後切換回主分支將bug分支合併。 第三部、 切換回dev分支,將bug分支同時 合併到dev分支(緣由是 : 避免是若是bug分支上修改的東西太多,在最後 dev開發完成之後,master合併dev分支的時候出現大面積的衝突)
git stash
git stash list 查看使用儲藏起來的工做現場 git stash apply 恢復工做現場(可是stash內容並不刪除) git stash drop 刪除stash內容 git stash pop 恢復工做現場並刪除stash內容 說明: git stash 只能「儲藏」已被追蹤過的文件。意思就是說若是是新添加的文件尚未執行過`git add`的文件,在使用git stash後仍是會在工做區中出現, 並不會別「儲藏」。因此要使用git stash, 請將untrack狀態的文件執行git add, 使其可被git追蹤 git stash 把當前工做現場「儲藏」起來(若是在一個分支上修改了文件可是由於尚未修改完不能提交的時候, 若是要開發出一個新的分支解決一個問題, 若是不使用git stash, 那麼在另外一個分支上也是能夠看到這個分支上修改的內容。) 結論 : 1.工做區和暫存區是共用的,在各個分支裏均可以看到沒被stash的文件。 2.在工做區和暫存區的文件均可以stash,pop以後都會出如今工做區 說明 : 假設在dev分支上正在開發,突然程序出現bug,須要即刻修復,可是dev分支上的任務尚未完成,沒法提交合併到master。 可是如今就須要在master上建立一個分支bugs去修復這個問題。由於工做區和暫存區對全部分支默認都是共用的,因此在bugs分支 上會執行dev分支上未完成的修改。這樣是不容許的。因此咱們能夠在dev分支中git stash 將dev分支 中的工做區和暫存區隱藏起來,這樣在別的分支中就看不到dev分支工做區中和暫存區中的已有的工做,這意味着工做區是乾淨的。咱們能夠在 bugs分支中能夠看到工做區是乾淨的,能夠執行任意咱們的任務。等待bugs分支開發完成,再切換到master分支,接着將bugs分支merge 到master。可是如今咱們思考一下,如今主分支是最新的(修復了bugs而且merge上去的),可是咱們的dev分支卻仍是和未修復bugs的 master主分支同步的版本。若是這樣的話,在咱們開發完dev分支而且合併到master分支上時,就有可鞥會出現問題(除非是增長文件,不然就 會出現合併衝突)。若是咱們的dev分支版本如今不存在master中存在的bug,則咱們徹底能夠放心。可是若是dev中也會出現像master 中出現的bug,則當咱們將dev合併到master中時,仍是會出現一樣的bug。主要是在這種狀況下,還會發生合併時候衝突。因此在將bugs 合併到master之後,咱們也能夠選擇將bugs分支合併到dev分支中,合併完成以後,如今master和dev中的代碼是同樣的。可是咱們以前 在dev中執行了git stash, 還有「儲藏」的工做區中已經開發但未提交的內容,當咱們執行git stash pop 恢復以前的工做現場並刪除 stash內容,會發現有衝突發生了(由於如今dev分支和master分支是同樣的,如今該文件是已經修復完成的, 可是咱們釋放的工做區中以前就對 該文件作了修改:同一個文件不一樣的內容,這樣就會明顯的出現衝突)。這是咱們就須要解決這些衝突(其實就是將以前修改的刪掉,保留和如今 master主分支中的文件同樣的信息)。解決完成之後。咱們就徹底解決了之後dev合併到master中可能存在的衝突,而且在合併之後不會再出現一樣 的錯誤
git remote (git給遠程庫起的默認名稱是origin)
git remote -v 查看遠程庫的信息 git remote show [remote] 顯示某個遠程倉庫的信息 git remote add [remote] [url] 增長一個新的遠程倉庫,並命名 (通常是origin) git remote rm [remote] 刪除遠程庫
git push
git push [remote] master 將主分支推送到遠程庫 git push [remote] [branch] 將([branch])分支推送到遠程庫 git push [remote] [tagname] 推送某個標籤到遠程 git push [remote] --tags 一次性推送所有還沒有推送到遠程的本地標籤
git pull origin 分支名稱 (取回遠程倉庫的變化,並與本地分支合併)
git pull [remote] [branch] 取回遠程倉庫的變化,並與本地分支合併 說明 : 在向遠程庫推送某個分支的時候,須要先"Git pull"更新本地的代碼 即 : 若是你的同事先在dev分支推送他的提交,接下來你去推送頗有可能會失敗。由於你的同事最新提交和你試圖推送的提交有衝突, 解決辦法也很簡單,Git已經提示咱們,先用git pull把最新的提交從origin/dev抓下來,而後,在本地合併,解決衝突, git add -> git commit -> 再推送 若是: git pull 也失敗了 : $ git pull remote: Counting objects: 8, done. remote: Compressing objects: 100% (6/6), done. remote: Total 8 (delta 2), reused 8 (delta 2), pack-reused 0 Unpacking objects: 100% (8/8), done. From github.com:yanqiangsjz/rhjt 6876a33..e2516f8 oneline -> origin/oneline There is no tracking information for the current branch. Please specify which branch you want to merge with. See git-pull(1) for details. git pull <remote> <branch> If you wish to set tracking information for this branch you can do so with: git branch --set-upstream-to=origin/<branch> oneline 緣由 : 沒有指定本地dev分支與遠程origin/dev分支的連接,根據提示,設置dev和origin/dev的連接:git branch --set-upstream-to=origin/dev dev git pull --rebase origin master 遠程庫同步到本地庫 (解決的問題:error: failed to push some refs to ‘git@gitee.com:name/project.git’)
git branch --set-upstream-to=origin/dev dev
git branch --set-upstream-to=origin/dev dev 設置dev和origin/dev的連接。成功之後就能夠git pull
git tag
git tag [tagname] 爲當前HEAD打標籤(本地tag) git tag [tagname] commitId(commitId 默認未HEAD; 本地tag) git tag -a [tagname] -m [message] commitId 爲本地tag添加說明 git tag 查看全部標籤信息 git show [tagname] 查看某個tag信息 git tag -d [tagname] 刪除本地標籤
刪除遠程標籤
git tag -d [tagname] -> git push [remote] :refs/tags/[tagname] 說明:git tag -d [tagname](先從本地刪除); git push [remote] :refs/tags/[tagname](而後,從遠程刪除)
git checkout -b [branch] [tag]
git checkout -b[branch] [tagname] 新建一個分支,指向某個tag
git fetch (取回遠程倉庫的變化,但並不會主動與本地分支合併。這個比git pull 更安git全)
//方法一 例子 git fetch origin master //從遠程的origin倉庫的master分支下載代碼到本地的origin master git log -p master.. origin/master//比較本地的倉庫和遠程參考的區別 git merge origin/master//把遠程下載下來的代碼合併到本地倉庫,遠程的和本地的合併 //方法二 git fetch origin master:temp //從遠程的origin倉庫的master分支下載到本地並新建一個分支temp git diff temp//比較master分支和temp分支的不一樣 git merge temp//合併temp分支到master分支 git branch -d temp//刪除temp
將本地git倉庫同步到github上
1. git remote add [remote] [url] 2. git push -u [remote] [branch] (指定[remote]爲默認主機) 3. 之後修改提交到遠程庫直接git push [remote] [branch]就能夠了 (不帶任何參數的git push,默認只推送當前分支)
忽略特殊文件
有些時候,你必須把某些文件放到Git工做目錄中,但又不能提交它們,好比保存了數據庫密碼的配置文件啦,等等, 每次git status都會顯示Untracked files ...,有強迫症的童鞋內心確定不爽。好在Git考慮到了你們的感覺, 這個問題解決起來也很簡單,在Git工做區的根目錄下建立一個特殊的.gitignore文件,而後把要忽略的文件名填 進去,Git就會自動忽略這些文件不須要從頭寫.gitignore文件,GitHub已經爲咱們準備了各類配置文件, 只須要組合一下就可使用了。全部配置文件能夠直接在線瀏覽. 查看請點擊下面的連接
配置別名(--global參數是全局參數,也就是這些命令在這臺電腦的全部Git倉庫下都有用,針對當前用戶。若是不加,那隻針對當前的倉庫起做用。)
git config --global alias.st status (爲查看狀態配置別名) git config --global alias.last 'log -1' (爲顯示最後一次提交信息配置別名) git config --global alias.unstage 'reset HEAD' (爲暫存區的修改撤銷回工做區配置別名) git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" 那麼配置文件放在哪裏呢: (1) 每一個倉庫的Git配置文件都放在.git/config文件中 (2) 當前用戶的Git配置文件放在用戶主目錄下的一個隱藏文件.gitconfig中 (3) 咱們能夠直接在配置文件中進行配置
pwd(linux命令)
pwd 顯示當前目錄