本文是Git的學習筆記,教程請移步 廖雪峯 Git 教程。git
目錄.git,是Git的版本庫。Git的版本庫裏存了不少東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲咱們自動建立的第一個分支master,以及指向master的一個指針叫HEAD。分佈式
git add把文件添加進去,實際上就是把文件修改添加到暫存區;學習
git commit提交更改,實際上就是把暫存區的全部內容提交到當前分支。spa
一大串相似 1094adb... 的是commit id(版本號),和SVN不同,Git的commit id不是1,2,3……遞增的數字,而是一個SHA1計算出來的一個很是大的數字,用十六進制表示。版本控制
爲何commit id須要用這麼一大串數字表示呢?指針
由於Git是分佈式的版本控制系統,多人在同一個版本庫裏工做,若是你們都用1,2,3……做爲版本號,那確定就衝突了。code
HEAD 指向的版本就是當前版本,之因此能夠回退版本這麼快,由於實際上只是改變了 HEAD 指針的指向。教程
HEAD嚴格來講不是指向提交,而是指向master,master纔是指向提交的,因此,HEAD指向的就是當前分支。開發
一開始的時候,master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能肯定當前分支,以及當前分支的提交點。每次提交,master分支都會向前移動一步,這樣,隨着你不斷提交,master分支的線也愈來愈長。rem
當咱們建立新的分支,例如dev時,Git新建了一個指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上。
建立並切換分支:git checkout -b dev
Git建立一個分支很快,由於除了增長一個dev指針,改改HEAD的指向,工做區的文件都沒有任何變化。
不過,從如今開始,對工做區的修改和提交就是針對dev分支了,好比新提交一次後,dev指針往前移動一步,而master指針不變。
在dev上的工做完成了,就能夠把dev合併到master上。Git怎麼合併呢?最簡單的方法,就是直接把master指向dev的當前提交,就完成了合併。
切換回 master 分支:git checkout master
將 dev 分支合併到 master 分支上:git merge dev
合併完分支後,甚至能夠刪除dev分支。刪除dev分支就是把dev指針給刪掉,刪掉後,咱們就剩下了一條master分支。
刪除 dev 分支:git branch -d dev
在實際開發中,咱們應該按照幾個基本原則進行分支管理:
首先,master分支應該是很是穩定的,也就是僅用來發布新版本,平時不能在上面幹活;
那在哪幹活呢?幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,好比1.0版本發佈時,再把dev分支合併到master上,在master分支發佈1.0版本;
你和你的小夥伴們每一個人都在dev分支上幹活,每一個人都有本身的分支,時不時地往dev分支上合併就能夠了。
因此,團隊合做的分支看起來就像這樣:
全局設置提交代碼時的用戶信息 git config --global user.name "[name]" git config --global user.email "[email address]"
在當前目錄新建一個Git代碼庫 git init
添加指定文件到暫存區 git add [file1] [file2] ... 添加當前目錄的全部文件到暫存區 git add .
提交暫存區到倉庫區 git commit -m [message]
列出全部本地分支 git branch 列出全部遠程分支 git branch -r 新建一個分支,但依然停留在當前分支 git branch [branch-name] 新建一個分支,並切換到該分支 git checkout -b [branch] 切換到指定分支,並更新工做區 git checkout [branch-name] 創建追蹤關係,在現有分支與指定的遠程分支之間 git branch --set-upstream [branch] [remote-branch] 合併指定分支到當前分支 git merge [branch] 刪除分支 git branch -d [branch-name] 刪除遠程分支 git push origin --delete [branch-name]
顯示有變動的文件 git status 顯示當前分支的版本歷史 git log 查看命令歷史 git reflog 顯示暫存區和工做區的差別 git diff
查看遠程庫信息 git remote -v; 在本地建立和遠程分支對應的分支 git checkout -b branch-name origin/branch-name(本地和遠程分支的名稱最好一致) 創建本地分支和遠程分支的關聯 git branch --set-upstream branch-name origin/branch-name 取回遠程倉庫的變化,並與本地分支合併 git pull [remote] [branch] 上傳本地指定分支到遠程倉庫 git push [remote] [branch]
恢復暫存區的指定文件到工做區 git checkout [file] 恢復暫存區的全部文件到工做區 git checkout . 重置暫存區與工做區,與上一次commit保持一致 git reset --hard commit_id 當改亂了工做區某個文件的內容,想直接丟棄工做區的修改時,用命令 git checkout [file]。 不但改亂了工做區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令 git reset HEAD [file],第二步用命令 git checkout [file]。
刪除工做區文件,而且將此次刪除放入暫存區 git rm [file] 更名文件,而且將這個更名放入暫存區 git mv [file-original] [file-renamed]
保存現場 git stash 返回現場 git stash pop