基本操作
- 初始化或者修改全局用户名:git config –global user.name “your name”
- 初始化或者修改全局提交邮箱git config –global user.email “user@example.com“
- 添加到文件暂存区 git add <file.txt> 可添加多个文件,空格隔开
- 提交文件到工作区 git commit -m “提交文字说明”
- 查看暂存区与工作区文件状态 git status
- 修改提交后的文件,可通过git diff查看修改的内容
- git diff 查看的是仓库文件与暂存区文件的区别,git diff –cached查看的是暂存区与上一次提交后也就是分支里面文件的区别
- 查看工作区与提交后分支里面的文件差异可以用git diff HEAD – <file.txt>
- 显示从最近到最远的提交日志 git log
- 回退版本 git reset -hard HEAD^ HEAD代表当前版本,加上^表示上一个版本,两个依次类推。也可写成HEAD~100,也可写成某一次确定的提交ID,在git log可看到,前几位ID即可
- git reflog 可以查看命令历史,包括每一次提交的ID,准确定位要回退的版本
- cat <file.txt> 可以查看文件内容
- 修改文件,未add到暂存区;或者add到暂存区后又修改文件后,未add。使用git checkout – file.txt可还原到上一次add或commit的操作版本。
- 修改文件后,并add到了暂存区,可使用git reset HEAD file.txt 取消add操作(仅仅是回退了add操作,并未回退文件修改内容),经试验,同一文件多次add操作在暂存区合并为一次,修改也合并为一次修改。也就是说,多次修改及add操作后,执行git reset HEAD file.txt和git checkout – file.txt后,文件会回到上一次commit后的内容。
- 修改文件并add后,有commit到本地仓库,可进行版本回退撤销之前的修改。
- 如果你用的rm删除文件,那就相当于只删除了工作区的文件,如果想要恢复,直接用git checkout –
就可以;如果你用的是git rm删除文件,那就相当于不仅删除了文件,而且还添加到了暂存区,需要先git reset HEAD ,然后再git checkout – ;如果你想彻底把版本库的删除掉,先git rm,再git commit 就ok了 - 关于git checkout –
既可以还原修改的操作,又可以从版本中还原文件。试验后我的理解是:这个操作会先检验暂存区有没有此文件,有的话就代替工作区的文件,没有就将版本库中的此文件代替工作区的文件。
与github相关联
创建ssh keys:ssh-keygen -t rsa -C “youremail@example.com“。并在github上进行相应的设置。
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;关联后,使用命令git push -u origin master第一次推送master分支的所有内容;此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
SSH协议:git@github.com:leaps339/learngit.git https协议:https://github.com/leaps339/learngit.git
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
克隆可用git clone 对应协议仓库
分支管理
- 查看分支:git branch
- 创建分支:git branch
- 转换分支:git checkout
- 创建并转换分支:git checkout -b
- 合并某分支到当前分支:git merge
- 删除分支:git branch -d
- 分支冲突时合并会有meger failed提示,此时需手动修改文件冲突再进行add、commit操作。完成合并后删除分支
- git log –graph 可以查看分支合并图
- 一般合并是fast forward模式,只是将head指针移动了位置,所以合并较快,但不能看到合并历史。
- 合并分支禁用fast forward:git merge –no-ff -m “提交说明”。将合并后的结果再一次进行commit操作,则可以看到合并历史。
- 在A分支上进行工作,有紧急情况需另开分支B解决其他问题。A分支上的工作并未完成,此时切换分支会将未完成工作带到B。在完成B工作后执行commit会将在A中的add的后的文件一并提交(在A中修改完文件没add不会受影响),并且Git规定在哪个分支上提交,就是在那个分支上工作。所以在切换时需使用git stash保存状态。链接
- 使用git stash后会保存工作区与暂存区的数据并清空暂存区。可使用git stash lish查看所有保存的stash,通过git stash apply恢复,git stash drop删除保存的stash。也可使用git stash pop,恢复的同时把stash也删了。当然可通过git stash apply stash@{0}恢复指定id的stash。
- 在另开一个分支A后没有合并分支A就要将其删除,可以使用git branch -D
强行删除
多人协作
- 使用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抓取分支后手动解决冲突再commit,然后进行push操作
标签管理
- 为某次提交打上一个标签,便于查找而不是用commit ID。相当于ip地址与域名的关系
- git tag
为当前最近一次commit打上标签,也可以在最后指定commit ID - 可以创建带有说明的标签git tag -a
-m “说明文字” - git show tag可以查看标签说明
- git tag可以查看所有标签
- 将指定本地标签推到远程仓库:git push origin
- 将所有未推送的标签推到远程仓库:git push origin –tags
- 删除指定标签:git tag -d
- 删除已经推到远程仓库的标签,先本地删除,然后删除远程仓库标签:git push origin :refs/tags/
自定义git
- 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件)。这个文件每一行保存了一个匹配的规则例如:
# 此为注释 – 将被 Git 忽略
*.cs # 忽略所有 .cs 结尾的文件
!ABC.cs # 但 ABC.cs 除外
/BLL # 仅仅忽略项目根目录下的 BLL 文件,不包括 subdir/BLL
build/ # 忽略 build/ 目录下的所有文件
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
规则很简单,不做过多解释,但是有时候在项目开发过程中,突然心血来潮想把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效,原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
另外有一个自动生成.gitignore文件内容的网站链接
- 可以通过git config –global alias.自定义命令 原始命令 为命令配置别名,相当于宏定义,方便记忆与敲打。