git常用命令
- 初始化
git init 初始化一个新的项目(会生成一个.git文件)
git --bare init 建立裸仓库,仓库中不包含工作目录
基本设置:
git config --global commit.template Name 设置提交时的模板
git config --global core.autocrlf true 表示启用转换,对windows和linux字符转换很有用
git config --global user.name "John Doe" 设置用户名
git config --global user.email johndoe@example.com 设置邮箱
- 配置文件文件存放位置:
/etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
.git/config 文件 :仅仅针对当前项目有效,用git configiu是设置的当前项目的设置
- 命令别名
要设置当前用户的命令别名,要修改~/.gitconfig文件
[alias]
co = checkout
ci = commit
比如上面,添加了alias选项卡,将checkout简化成co
git config --global alias.co ‘checkout’ 也能实现上面相同的效果
- 配置忽略文件:
可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。要养成一开始就设置好 .gitignore 文件的习惯,以免将来误提交这类无用的文件。来看一个实际的例子:
# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录下所有扩展名为 txt 的文件
Doc /**/*.txt
注意,假如此时我的暂存区里有一个test.txt,然后我再配置.gitignore文件,忽略掉txt结尾的文件,那么将不会忽略掉原来的test.txt,而只会忽略掉之后这个文件夹里面新添加的txt文件
- 提交:
git commit
git commit -a 用于跳过暂存,将所有追踪的文件进行提交
git commit --amend 如果是修改描述,就直接在之前提交后,直接运行
如果是添加新的文件或者删除、修改文件,都按照想要进行的操作,进行修改、删除,然后添加到暂存区,再运行上面的命令
注意:这会改变commit的标识,相当于一次rebase,所以不要再已经推送到远程仓库后使用这种操作
提交建议:
本次更新的简要描述(50 个字符以内)
如果必要,此处展开详尽阐述。段落宽度限定在 72 个字符以内。
某些情况下,第一行的简要描述将用作邮件标题,其余部分作为邮件正文。
其间的空行是必要的,以区分两者(当然没有正文另当别论)。
如果并在一起,rebase 这样的工具就可能会迷惑。
另起空行后,再进一步补充其他说明。 - 可以使用这样的条目列举式。 - 一般以单个空格紧跟短划线或者星号作为每项条目的起始符。每个条目间用一空行隔开。 不过这里按自己项目的约定,可以略作变化。
- 查看提交日志:
Git log 会打印出当前分支的所有提交历史
Git log -p 表示显示最近一次提交的详细信息以及与前一次的差异
Git show <标识符> 表示显示指定的提交与其上一次之间的差异,以及它的详细信息
Git log -num 表示显示最近提交的num条记录
- 图形化工具
运行gitk这条命令,就会出现图形化
- 处理暂存区工具
git add -i 是一个交互式处理工具,可以很方便的处理暂存区,包括加入暂存区,撤销暂存区文件,不追踪文件等等功能
- 查看区别
git status查看当前的状态(已修改,已暂存,未跟踪等等)
git diff命令可以查看已暂存与已修改之间的差别
git diff --cached 可以查看已经暂存起来的文件和上次提交时的快照之间的差异
git diff master...contrib中,... 添加在原始分支和当前分支中间,表示比较master和contrib分支的共同祖先和contrib之间的差别,这样就能看出分支即将引入的代码
- 克隆别人的项目:
git clone git://github.com/schacon/grit.git 或者
git clone git://github.com/schacon/grit.git mygrit
这会在当前目录下生成一个grit或者mygrit的目录,里面有所有的文件
- 添加和删除远程仓库:
git remote add [shortname] [url]
git remote rm [shortname]
- 查看远程仓库:
git remote 只是列出远程仓库的名字
git remote -v 列出远程仓库的名字和地址
git remote show [remote-name] 显示某个仓库的详细信息
git remote rename oldName newName 修改某个远程仓库在本地的简称
- 远程仓库和克隆项目的区别:
为项目添加远程仓库,远程仓库和自己的项目其实是同一个项目,只是可以通过远程仓库拉取别人的提交成果,共同完成项目
而克隆别人的项目,是自己没有这个项目的任何资源,克隆一个别人的项目,把这个项目作为自己的一个本地的项目
- git分支
git branch name 用于创建分支
git checkout -b name 创建新的标签并且换到新的标签
git branch 查看分支
git branch -d 删除分支
git checkout 切换到新的分支
git merge 合并分支
git branch --merged 查看当前分支的上游(并入当前分支的分支)
git branch --no-merged 查看当前仍未并入的分支
分支的合并需要格外注意,如果是对同意文件修改的两个分支合并,必定产生冲突,需要手动讲两个文件内容进行取舍,变成一致后才能成功,如果是对不同文件的编辑或者修改新增等,能够直接和并成功
- 变基:
如图里c3’就是打的补丁,这样提交历史就不会有c3,而是c3’,是基于c4的提交
git rebase [主分支] [特性分支] 将特性分支的补丁打到主分支上
变基也可以放到其他分支进行,并不一定非得根据分化之前的分支。
git rebase --onto master server client 将server和client两个特性分支的不同部分作为补丁,打到master分支上
一定要注意:一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行变基操作。因为这可能导致下载公共仓库里面提交的人,得到错误的提交历史
- git标签:
Git tag -a v1.0 带注释的标签,记录这标签是啥时候打的,谁打的,添加个标签的注解
git tag -a version 85fc7e7(提交的校验码) 能够对之前的提交追加标签
git tag -d v1.1 删除标签
Git tag 列出标签
git tag -l 'v1.4.2.*' 按照匹配列出标签
git show v1.0 查看标签的注释内容
Git push 远程库名 标签名 推送标签到远程服务器上
Git push 远程库名 --tags 表示推送所有标签到远程库
- 抓取数据
git fetch <远程仓库名> 取回远程仓库所有数据,不合并
git fetch <远程仓库名> <分支名> 取回远程仓库固定分支数据,不合并到主分支
git pull <远程主机名> <远程分支名>:<本地分支名> 拉取远程分支上的数据,合并到本地分支
git pull <远程主机> <远程分支> 拉取远程分支和当前分支合并
git pull 有跟踪分支时,可以自动获取
比如master就是一个跟踪分支,那么在master上用git pull 会自动将远程master分支数据拉取下来进行合并
- 远程分支
远程分支(remote branch)是对远程仓库中的分支的索引。它们是一些无法移动的本地分支,用 (远程仓库名)/(分支名) 这样的形式表示远程分支,远程分支不用自己创建,在拉取远程仓库的数据时,由git自己创建
远程分支无法移动,但是通过git fetch 抓取下来的远程分支会指向最新的记录,同时可以通过merge语句将远程分支的内容合并到本地分支
删除处于服务器上的远程分支:git push 远程仓库名 :远程分支名
$ git checkout -b Name origin/serverfix 创建跟踪分支,跟踪分支是从远程分支checkout出来的,是可以移动的,并且在跟踪分支里面用push和pull都可以自动推送或者拉取远程仓库对应的分支,并进行合并
- 推送数据:
Git push 表示将本地master分支上的提交数据推送到远程仓库的master分支(因为跟踪分支的作用)
Git push 远程仓库名 本地分支名 :远程分支名 表示推送自己的分支到服务器,并且指定了此分支在服务器上的名字
- 删除数据:
git rm 不再跟踪,并且完全删除该文件
git rm -f 如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项
git rm --cached 仅仅是想从跟踪清单里面删除,而不是删除文件
- 重命名:
git mv oldName newName 重命名并不会体现出这是一次改名操作。不用从新提交
- 储藏
储藏能够让你在工作目录中存在修改未暂存,以及暂存的文件在切换分支时不用提交,而是新开一个栈对数据进行保存
git stash 对工作目录进行储藏
git stash list 查看现有的储藏
git stash apply 应用最新的一次储藏
git stash apply stashID 应用指定的储藏(不会删除暂存)
git stash apply --index
git stash pop stashID 应用并且删除暂存
git stash drop stashID 删除栈上的暂存
git stash show -p stashID | git apply -R 取消暂存的应用
git stash branch name 应用场景是当你储藏了修改,并且继续在本分支里面工作,工作时修改了和储藏里面一样的文件,那么重新应用储藏时会发生冲突,用这个命令会新建一个分支,并且将储藏的数据pop到新分支
被暂存的数据不一定要在自己的分支恢复,可以将暂存的数据放到另一个分支里面进行恢复