title: Git 札记:基础 date: 2018-12-01 17:25:42 categories:
安装过程中选择'User Git from Git Bash only',完全不修改 PATH 环境变量,仅在 Git Bash 中使用 Git
$ git --version //查看git是否安装成功及版本号
设置签名:区分不同开发人员的身份
$ git config --global user.name "tujidelv" //为该机器上所有的git仓库指定用户名
$ git config --global user.email "tujide.lv@foxmail.com" //为该机器上所有的git仓库指定email地址
适当地显示不同的颜色
$ git config --global color.ui true
e69de29bb23b18e512db test.txt
Tips:Git提供了git add命令简化上面2步操作。
c3b8bb102a
c9053865e9
Tips:Git提供了git commit命令简化上面2步操作。
常用命令
- git help <命令>
- git init //初始化版本库(把当前目录变成git可以管理的仓库[会在当前目录创建一个.git子目录,用来保存版本信息])
- git add <FILE...|DIR...> //告诉git把文件添加到仓库的暂存区,可反复多次使用,并且每次可添加多个文件
- 实际上就是把要提交的所有修改添加到暂存区(stage)
- git add --all/-A/. //对当前项目所有变动的文件,执行保存二进制对象和更新暂存区操作
- git commit -m "wrote a readme file" //告诉git把文件提交到仓库的分支(-m 后面输入的是本次提交的说明),一次可提交多个文件
- 实际上就是一次性把暂存区的所有修改提交到分支(master)
- git status //查看工作区/暂存区的状态
- git status -s //返回一个简单版的 git status。我设置这个命令为默认 git status 来减少噪音。
- git diff [FILE] //如果git status提示有文件被修改,可以用此命令查看指定文件修改了哪些内容,显示的格式是Unix通用的diff格式
- 比较的是版本库(暂存区和分支中的任意一个)与工作区同名文件相比是否相同,而git diff --cached比较的是暂存区有无内容
- git diff HEAD [FILE] //将工作区中的文件和本地库历史记录比较
- git checkout -- <FILE>... //撤销此文件在工作区的修改(包括删除),回到最近一次commit或add时的状态
- git checkout -- . //撤销工作区所有的修改
- git checkout -- *.java //撤销工作区所有java文件的修改
- git reset HEAD <FILE>... //撤销此文件在暂存区的修改,回退到工作区
- git reset HEAD * //撤销暂存区所有的修改
- git rm FILE //当想从版本库中删除文件时,可先在工作区删除,然后调用此命令,再commit
- git rm –cached FILE //只删除远程文件,但是不影响本地文件。这对删除已经推送过的忽略文件记录而且不影响本地文件是非常的方便的。
- git log //显示从最近到最远的提交日志。其中commit(快照) id是用SHA1算出的16进制数字
- 后面加上--pretty=oneline可以精简信息
- 后面加上--graph可以看到分支合并情况
- 后面加上--abbrev-commit可以精简快照id
- git reflog //查看命令历史,当找不到新版本的id时可以用此来确定要回到未来的哪个版本
- HEAD@{移动到当前版本需要多少步}
- git reset --hard HEAD~ //版本回退,HEAD代表当前版本,~代表回退到上个版本,如回到上100个版本可以用HEAD~100来表示
- git reset --hard 43ade3f //当想回到之前的新版本时(也能后退),可以找到它的commit id输入前几位即可(基于局部索引值操作,推荐)
- --hard //会让当前工作区和暂存区的修改也撤销
- --soft //不会让当前工作区和暂存区的修改也撤销,上次的提交由本地仓库回到暂存区
- --mix //不会让当前工作区的修改撤销,会让暂存区的修改撤销,上次的提交由本地仓库回到暂存区
- git stash //隐藏工作现场
- 当手头工作没有完成时(工作区/暂存区有变动时),先把工作现场git stash隐藏一下,这样git status查看工作区是干净的,然后去修复bug,修复后,再git stash pop,回到份工作现场
- git stash list //查看隐藏的工作现场
- git stash pop //恢复隐藏的工作现场,同时删除stash内容
其他命令
- git shortlog -sn //显示提交记录的参与者列表。和GitHub的参与者列表相同。
- git reflog //显示你在本地已完成的操作列表。
解决冲突
当 Git 无法自动合并分支时,须手动编辑文件解决冲突,然后再添加到暂存区再提交,合并完成
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
分支管理策略
Rebase
创建标签
$ git tag <tagname> //新建一个标签,默认是打在当前分支下的最新commit上的
- $ git tag <tagname> [commitid] //打在某次指定(commit id)提交上
- $ git tag -a <tagname> -m "" [commitid] //创建带有说明的标签,-a指定标签名,-m指定说明信息
- $ git tag -a v0.1 -m "version 0.1 released" 3628164
- $ git tag -s <tagname> -m "" [commitid] //创建PGP签名的标签,不可伪造,-s用私钥签名一个标签
- 必须先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错;如果报错,请参考GnuPG帮助文档配置Key
操作标签
$ git tag //查看所有标签,按字母排序列出,而不是按时间顺序
$ git show <tagname> //查看指定标签信息
$ git tag -d <tagname> //删除一个本地标签
$ git push origin <tagname> //推送一个本地标签到远程
$ git push origin --tags //推送全部未推送过的本地标签到远程
$ git push origin :refs/tags/<tagname> //删除一个远程标签,需先删除对应的本地标签
有些时候添加一个文件到 Git,但发现添加不了,原因是这个文件被 .gitignore 忽略了,有如下2种处理方法
$ git add -f FILE //用-f强制添加到Git
$ git check-ignore -v FILE //检查.gitignore文件的哪个配置影响了该文件,好修改规则
Windows 下创建 .gitignore 文件的常用方法
通过命令配置
加上--global 是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.unstage 'reset HEAD'
$ git config --global alias.last 'log -1' //显示最近一次的提交
$ 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"
通过文件配置
每个仓库的 Git 配置文件都放在 .git/config 文件中,而当前用户的 Git 配置文件放在用户主目录下的一个隐藏文件 .gitconfig 中,别名就在[alias]后面,要删除别名,直接把对应的行删掉即可
[alias]
co = checkout
ci = commit
br = branch
st = status
unstage = reset HEAD
last = log -1
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
[user]
name = tujidelv
email = tujide.lv@foxmail.com
windows 版 git bash 设置其他命令别名