工作以来一直使用git,日常使用ok,确实总结,今天记录一下。
1.创建库,完成一次提交:
$ mkdir learngit
$ cd learngit
$ git init
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "wrote a readme file"
2.查看当前工作区修改
场景1:有修改,但未提交
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
场景2:有修改,未已提交
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
此时可以查看修改内容
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
场景3:修改已提交
$ git status
On branch master
nothing to commit (working directory clean)
3.版本回退
查看版本提交历史 git log
查看简化历史列表 git log --pretty=oneline
以图的方式查看 git log --graph --pretty=oneline
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164…882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
回退版本:
$ git reset --hard HEAD^
HEAD is now at ea34578 add distributed
reset只是head只是指向commmit,版本并没有删除。
查看head指向过的提交
$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file
版本修改
$ git reset --hard 3628164
HEAD is now at 3628164 append GPL
git revert 是生成一个新的提交来撤销某次提交,此次提交之前的commit都会被保留
git reset 是回到某次提交,提交及之前的commit都会被保留,但是此次之后的修改都会被退回到暂存区
4.工作区与暂存区
工作区:系统目录
暂存区:.git下index保存修改
比较工作区与暂存区的比较:git diff
5.不知所以
git reset HEAD readme.txt
git checkout -- readme.txt
6.分支管理
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
暂存当前修改: git stash
恢复暂存:git stash list -> git stash pop
查看远程库信息: git remote -v
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)
合并过程:
$ git log --graph --pretty=oneline --abbrev-commit
* 7825a50 merge with no-ff
|\
| * 6224937 add merge
|/
* 59bc1cb conflict fixed
...
7.多人协作
查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
使用git fetch只抓取内容
8.打出标签tag
命令git push origin <tagname>可以推送一个本地标签;
命令git push origin --tags可以推送全部未推送过的本地标签;
命令git tag -d <tagname>可以删除一个本地标签;
命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
9.开发模式集成场景:
分支开发模式:
1.开发创建:开发拉取各自的feature分支
2.集成合并:从主干拉取一个release分支,将所有要发布的开发分支合并release分支
3.构建部署:
4.写入基线:从release分支git tag出一个版本,作为发布版本
主干开发模式
1.主干分支:设定一个主干分支dev,
2.开发提交:所有dev都在上面提交代码
3.集成合并:从主干拉取release分支
3.构建部署:
4.写入基线:从release分支git tag出一个版本,作为发布版本
git-develop模式
1.开发创建:开发拉取各自的feature分支(集成目标:develop),合并到默认devlop分支
2.集成合并:从主干拉取release分支,合并develop分支
3.构建部署
4.写入基线:从release分支git tag出一个版本,作为发布版本
紧急修复:拉取bug分支(集成目标为master),使用master和bug分支和发布,然后合并会develop分支。
10.奇淫技巧
1.忽略git下的文件
2.配置命令别名
3.git cherry-pick 某次提交
4.git blame file 文件每行最近一次修改的版本和时间
详见大神网站