转载至:https://www.cnblogs.com/fanyegong/p/5127780.html
一、定义:以下均使用括号中的简称
工作区:workspace (W)
暂存区:index (I)
本地仓库:local repository (L)
远程仓库:remote repository (R)
二、常用命令:
1.初始化
git init
2.常用配置信息
(如果不使用--global,则只设置当前项目的配置信息)
设置代理:
git config --global http.proxy http://xxx.com:port
取消代理:
git config --global --unset http.proxy
设置用户名:
git config --global user.name "[name]"
设置邮箱:
git config --global user.email "[email address]"
设置命令行颜色:
git config --global color.ui auto
查看用户名:
git config --global user.name
配置crlf:
git config --global core.autocrlf [true/false/input]
(在windows下设置为true,则提交的内容是LF,本地是CRLF)
配置文件名大小写敏感:(git默认不区分文件名大小写)
(可以新增文件,但是之前文件还没有删除) git config core.ignorecase false
(可以尝试) git mv --force myfile myFile
3.添加--从工作区W到暂存区I
添加单个文件/多个文件/目录:
git add [file1] [file2] [directory]
添加新增和修改的文件,不做删除操作:
git add .
添加修改和删除的文件,不做新增操作:
git add -u
添加增删改的文件:等于git add .;git add -u;
git add -A
4.提交:
(1)从暂存区I到本地仓库L
git commit -m [提交信息]
(2)
5.撤销
(1)从暂存区I到工作区W
git rm --cached <file> ...
(2)恢复到HEAD版本
git reset --hard HEAD
(3)修改提交的用户名信息
git commit --amend --author="Author Name <email@address.com>"
6.远程
- 更改远程仓库地址
git remote set-url origin http://xxx.xx.com/x.git
- 查看远程仓库地址
git remote show origin
- 本地项目与远程git地址进行关联,比如项目初始化,新建的项目可以使用
git remote add origin https://xxx.xxx.xxx.xxx/xxx/xxx-wechat-web.git
- 查看远程仓库日志
git log origin/master
(3)比较本地分支和远程分支
git diff master origin/master
(4)查看远程分支
git branch -r
(5)拉取远程
方法1:拉取并合并
git pull
拉取远端指定分支代码:
git pull origin 分支名称
方法2:先拉取后合并
git fetch origin
git merge origin/master
(6)查看本地分支和远程分支的差异
git diff master origin/master
(7)基于远程分支创建本地分支
git checkout -b feature origin/feature
7.分支
查看分支:git branch
查看远程分支的本地copies:git branch -r
查看远程分支: git ls-remote
查看所有分支: git branch -a
创建分支:git branch <origin/name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name> <origin/name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
删除远程分支: git push origin --delete
获取远程分支: git fetch
更新远程分支的本地copies: git fetch --prune origin
删除不存在的远程分支的信息:git remote prune origin
8.储藏
保存:git stash
查看stash列表:git stash list
恢复:git stash apply
恢复特定版本:git stash apply stash@{2}
清除某个stash记录:git stash drop stash@{0}
9.引用
(1)查看提交的哈希字串
git log
git log --pretty=oneline
查看历史中有xxx的
git log -G"删除掉的内容" -p
git log -S"删除掉的内容" -p
git log --grep "删除掉的内容"
git log -p | grep "删除掉的内容"
(2)查看某个提交
git show 0c708f(哈希)
(3)查看分支、标签或间接引用的哈希
git rev-parse master
(4)查看引用
在.git/refs目录下
git show refs/heads/some-feature
在.git目录下还有一些引用:
HEAD – 当前所在的提交或分支。
FETCH_HEAD – 远程仓库中fetch到的最新一次提交。
ORIG_HEAD – HEAD的备份引用,避免损坏。
MERGE_HEAD – 你通过git merge并入当前分支的引用(们)。
CHERRY_PICK_HEAD – 你cherry pick使用的引用。
(5)refspec
refspec的定义是这样的:[+]<src>:<dst>。<src>参数是本地的源分支,<dst>是远程的目标分支。可选的+号强制远程仓库采用非快速向前的更新策略。
(6)相对引用
git show HEAD~2 祖父节点
git show HEAD^2 第二个父节点(分支合并时,原所在分支是第一个父节点)
git show HEAD^2^1 可以多层
(7)引用日志
git reflog
gitcheckoutHEAD@{1}
10.代码回滚
reset checkout revert的选择
reset checkout 可以指定文件或某次提交,revert只针对提交,不针对文件
checkout revert 有可能会重写文件,在使用前要提交或缓存工作目录的修改
(1)reset(仅仅用在私有分支上,一般只用HEAD)
git checkout feature
git reset HEAD (末端两个提交变成悬挂提交,git垃圾回收时会被删除)
git reset --hard HEAD
--soft – 缓存区和工作目录都不会被改变
--mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响
--hard – 缓存区和工作目录都同步到你指定的提交
git reset HEAD file1.js 将HEAD提交中的该文件加入到缓存区,针对文件没有--mixed之类的参数
(2)checkout
git checkout feature 切换分支
git checkout HEAD~2 把HEAD移动到特定提交,但会造成HEAD分离,非常危险,如果你接着添加新的提交,然后切换到别的分支之后就没办法回到之前添加的这些提交。因此,在为分离的HEAD添加新的提交的时候你应该创建一个新的分支。
git checkout HEAD~2 file1.js 将工作目录的该文件同步到HEAD~2
(和git reset HEAD --hard很像,但只影响特定文件)
(3)revert(可以用在公共分支,不会影响历史,创建一个新的提交来撤销某个提交的修改)
git checkout feature
git revert HEAD~2
11.打标签
(1)查看当前标签
git tag
(2)打标签
git tag -a v1.0.0 -m "my version v1.0.0"
(3)查看某个tag
git show v1.0.0
(4)删除某个tag
git tag -d v1.0.0
(4)把tag推送到远程
git push origin --tags
12.比较
git diff 工作区(W)跟暂存区(I)的区别(使用 f 翻下一页,使用b 翻上一页)
git diff HEAD工作区(W)跟本地仓库(L)的区别
git diff --staged 暂存区(I)跟本地仓库(L)的区别
(后边跟上文件名则只对比某个文件)
提交前比较某个文件
git diff -- myfile.js
git diff --cached myfile.js
比较时忽略空格变化
git diff -w (--ignore-all-space)
使用图形化工具查看比较
gitk &
设置图形化工具的编码
git config --global gui.encoding utf-8
13.打包
git archive --format zip --output /path/to/file.zip master
14.分支的衍合
git checkout feature
git rebase master
解决冲突后 git add .
git rebase --continue
15.只合并某个提交或者某个文件
git cherry-pick <commit id> 合并某一个提交
git cherry-pick -x <commit id> 合并某一个提交,并保留原提交的信息
git cherry-pick <start commit id>..<end commit id> 合并某个区间的提交,左开右闭
git cherry-pick <start commit id>^..<end commit id> 合并某个区间的提交,闭区间
git checkout branchname -- <paths>
git merge --no-ff --no-commit branchname (不快速向前,不提交)
16.git 免重复登录方式
git本身支持SSH方式,在此不具体介绍了。
git支持credential的方式,在win7下可以设置credential helper为wincred,可以在"控制面板"--"用户账户"--"凭据管理器" 里查看凭据。
设置和取消凭证管理的方式:
git config --global --unset credential.helper
git config --global credential.helper wincred
17.git 设置命令别名
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.lg "log --color --gragh --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(blod blue)<%an>%Creset' --abbrev-commit"
参考地址:http://blog.csdn.net/zhang31jian/article/details/41011313
18.git 判断代码最初是由谁提交的
git blame <filename>
git blame -L 100,100 <filenname>
git blame -L 100,+10 <filename>
三、常用场景:
1.创建新的库
mkdir tutorial
cd tutorial
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin http://xxx.xx.com/x.git
git push -u origin master
2.push已经存在的库
cd existing_repo
git remote add origin http://xxx.xx.com/x.git
git push -u origin master
3.merge request
git fetch origin
git checkout -b request-branch origin/request-branch
git checkout master
git merge --no-ff request-branch
git push origin master
默认情况下,Git执行"快进式合并"(fast-farward merge),会直接将Master分支指向Develop分支。
使用--no-ff参数后,会执行正常合并,在Master分支上生成一个新节点。为了保证版本演进的清晰,我们希望采用这种做法。
4.github quick setup
(1)https://github.com/username/gittest.git
git@github.com:username/gittest.git
(2)create a new repository on the command line:
echo "# gittest" >> README.md
git init
git add REAME.md
git commit -m "first commit"
git remote add origin git@github.com:username/gittest.git
git push -u origin master
(3)push an existing repository from the command line
git remote add origin git@github.com:username/gittest.git
git push -u origin master
(4)import code from another repository
You can initialize the repository with code from a Subversion,Mercurial, or TFS project.
5.gitflow
参考链接:http://www.cnblogs.com/cnblogsfans/p/5075073.html
可以使用GUI工具SourceTree(http://blog.csdn.net/victor_barnett/article/details/51211282)
git flow init之后,配置文件和hooks分别在.git/config .git/hooks/
初始化:git flow init
开始新Feature:git flow feature start MYFEATURE
Publish一个Feature(也就是push到远程):git flow feature publish MYFEATURE
获取Publish的Feature:git flow feature pull origin MYFEATURE
完成一个Feature:git flow feature finish MYFEATURE
开始一个Release:git flow release start RELEASE [BASE]
Publish一个Release:git flow release publish RELEASE
发布Release:git flow release finish RELEASE
别忘了git push --tags
开始一个Hotfix:git flow hotfix start VERSION [BASENAME]
发布一个Hotfix:git flow hotfix finish VERSION