基本操作
cd <目录名> //进入某个目录
cd .. //返回上一级目录
ls //查看当前目录的文件
ls -l //查看当前目录的文件的详细信息
cat <文件名> //打印某个文件内容
设置身份信息
git config --global user.name <用户名>
git config --global user.email <邮箱>
查看身份信息
git config --global user.name
git config --global user.email
设置编辑器与对比器
git config --global core.editor emacs
git config --global merge.tool vimdiff
查看设置
git config --list //查看所有设置
git config --global --list //查看所有全局设置
Git里面一共有3个配置文件:仓库级配置文
件(local)、全局级配置文件(global)、系统级配置文件(system)。
获取帮助
git help <命令>
创建本地的代码仓库
本地没有项目情况:
git init <工程名>
本地有项目情况:
git init
将文件放入暂存区
git add <文件名> //添加一个文件到暂存区
git add -u //将所有Tracked文件中被修改或删除的文件信息添加到暂存区,不会处理Untracked文件
git add . //将工作区的所有文件全部加到暂存区
如果对新添加的文件执行git add操作,那么该文件已经添加到版本控制系统(Tracked)中。如果想从版本控制系统中移除,可以执行以下命令:
git rm -r --cached <文件名> //对某一个文件清除版本控制标记
git rm -r --cached . //对所有文件清除版本控制标记
问题:
文件存在于本地分支与远程分支,执行git rm -r --cached操作,修改远程分支文件,然后执行git pull操作,是否会覆盖工作区文件?
分析:
执行git rm -r --cached操作后,文件处于UnTracked状态,这时执行git pull操作,会同步远程分支到远程跟踪分支,但是远程跟踪分支合并到本地分支失败,因为工作区有未提交的修改(即执行git rm -r --cached操作后工作区有UnTracked文件,需要执行git add操作跟git commit操作)。如果先执行git add操作跟git commit操作,再执行git pull操作,就会同步远程分支到远程跟踪分支跟本地分支,工作区文件会被覆盖。
将暂存区的内容提交到分支
git commit -m <描述>
查看工作区与暂存区的状态
git status
查看差异对比
git diff //比较工作区与暂存区的差异
git diff <文件名> //比较工作区文件与暂存区文件的差异
git diff <7位版本号> <文件名> //比较工作区文件与某个提交历史记录的差异
git diff HEAD //比较工作区与HEAD指针指向内容的差异
git diff <7位版本号> <7位版本号> //比较两次提交之间的差异
git diff <分支名> //比较工作区与某分支的差异,远程分支这样写:remotes/远程仓库名/远程分支名
git diff <分支名>..<分支名> //比较两个分支之间的差异
git diff --staged //比较暂存区和版本库差异
git diff --cached //比较暂存区和版本库差异
如果只想统计哪些文件被改动,多少行被改动,可以添加 --stat 参数
查看提交历史记录
git log //查看所有提交记录(SHA-A校验和,作者名称,邮箱,提交时间,提交说明)
git log -<次数> //查看最近多少次的提交记录
git log -p -<次数> //查看最近多少次的详细提交记录
git log <文件名> //查看某个文件的修改记录
git log -p <文件名> //查看某个文件的详细修改记录
git log --author=<用户名> //查看某个人的提交记录
git log --grep=<过滤信息> //列出提交信息中包含过滤信息的提交记录
git log --pretty=format:"%ad : %h : %an : %s" //定制格式显示提交记录
git log --oneline //提交记录以精简的一行输出
git log --stat //显示每次提交有哪些文件被改动,多少行被改动
git log --graph --all //图像显示分支的合并历史
git log --graph --pretty=oneline --abbrev-commit //图像显示分支的合并历史,每个提交记录只显示一行且只显示7位的版本号
查看某次提交修改内容
git show <7位版本号>
查看某行代码是谁写的
git blame <文件名> //查看某个文件的每一行代码的作者,最新提交版本号和最新提交时间
查看某个分支的版本号
git rev-parse <分支名>
文件恢复(reset)
(1)工作区中的文件已删除,未执行git add操作:
git checkout <文件名> //注意:会抛弃工作区的修改,不可恢复
(2)工作区中的文件已删除,已执行git add操作,未执行git commit操作:
git reset HEAD <文件名>
git checkout <文件名>
(3)工作区中的文件已删除,已执行git add操作,已执行git commit操作:
git reset HEAD^ //回退到上一个版本
git reset HEAD^^ //回退到上上个版本,以此类推
git checkout <文件名> //从暂存区恢复某个文件到工作区
或者:
git reset --hard <7位版本号> //回退到某个版本,并且工作区会恢复到该版本的状态,不需要再执行git checkout操作
git reset的三个参数(默认为 --mixed):
--soft:修改HEAD指针指向,暂存区和工作区不变。
--mixed:修改HEAD指针指向,暂存区内容丢失,工作区不变。
--hard:修改HEAD指针指向,暂存区内容丢失,工作区恢复以前状态。
撤销提交(revert)
git revert HEAD //撤销最近的一个提交
git revert <7位版本号> //撤销某次修改
生成一个新的提交来覆盖旧的提交,被撤销的提交和新的提交都会有记录。
git revert之后输入 :q! 退出编辑状态。
查看输入的每一条指令
git reflog //不会永远保存,会定期清理
命令自动补全
输入命令的时候按两次Tab
查看分支
git branch //本地分支
git branch -a //本地分支 + 远程跟踪分支
git branch -r //远程分支
git remote //远程仓库名字
git remote -v //远程仓库地址
创建分支
git branch <分支名>
切换分支
git checkout <分支名>
创建和切换分支
git checkout -b <分支名>
分支合并
1.merge:
把develop分支的修改合并到master分支:
(1)快速合并,合并后无合并记录。切换到master分支:
git merge develop
(2)普通合并,合并后有合并记录。切换到master分支:
git merge --no-ff -m <描述> develop
2.rebase:
A分支跟B分支都是基于master分支的最新版本号checkout出来的。首先,A分支对某个文件进行修改,提交后合并到master分支,这时master分支的版本号已更新,而B分支的base版本号仍然是基于master分支的旧版本号,然后B分支基于master分支执行git rebase操作,将base版本号提高到master分支的最新版本号,这样B分支则是在master分支的最新版本号基础上做修改。
git rebase master
解决合并冲突
1.merge:
打开冲突文件,手动解决冲突,解决后执行git add操作跟git commit 操作。
2.rebase:
打开冲突文件,手动解决冲突,解决后执行以下命令处理下一个冲突:
git rebase --continue
所有冲突解决完后提交修改。
其它命令:
git rebase --abort //放弃所有的冲突处理,恢复rebase前的情况
git rebase --skip //跳过当前冲突,处理下一个冲突,不建议使用
删除分支
git branch -d <分支名> //删除分支,分支上有未提交的修改是不能删除的
git branch -D <分支名> //强行删除分支,尽管这个分支上有未提交的修改
恢复误删的分支
git reflog //查看误删分支的版本号
git branch <分支名> <7位版本号>
分支重命名
git branch -m <旧分支名> <新分支名>
切换分支时保存未commit的修改
1.分支不存在的文件
(1)develop分支新添加文件,未执行git add操作,需要切换到master分支:
可以直接切换到master分支,切换后master分支可以看到develop分支新添加的文件。
(2)develop分支新添加文件,已执行git add操作,需要切换到master分支:
可以直接切换到master分支,切换后master分支可以看到develop分支新添加的文件。
(3)develop分支新添加文件,已执行git add操作,已执行git commit操作,需要切换到master分支:
可以直接切换到master分支,切换后master分支不可以看到develop分支新添加的文件。
2.分支已存在的文件
(1)develop分支对已有的文件进行修改,未执行git add操作,需要切换到master分支,直接切换会报错:
error: Your local changes to the following files would be overwritten by checkout:
<文件名>
Please commit your changes or stash them before you switch branches.
Aborting
可以执行git add操作跟git commit操作提交修改。
也可以执行以下命令保存修改:
git stash //执行该命令就可以保存develop分支的修改,然后就可以切换到master分支了
git stash apply //从master分支切换回develop分支后,执行该命令就可以恢复develop分支的修改
//之后提交修改需要执行git add操作跟git commit操作
git stash list //stash列表
git stash apply stash@{0} //根据stash标识符恢复修改
(2)develop分支对已有的文件进行修改,已执行git add操作,未执行git commit操作,需要切换到master分支,直接切换会报错:
可以执行git commit操作提交修改。
也可以执行git stash操作保存修改。
修改远程仓库地址
git remote set-url <远程仓库名> <远程仓库地址>
或者:
git remote rm <远程仓库名> //删除仓库关联
git remote add <远程仓库名> <远程仓库地址> //添加仓库关联
克隆远程仓库
git clone <远程仓库地址> //克隆项目到当前文件夹下
git clone <远程仓库地址> <目录名> //克隆项目到某个目录下
推送本地分支到远程仓库
git push <远程仓库名> <远程分支名> //推送本地分支的内容到远程分支,如果远程分支不存在则会新建一个
比较本地分支与远程跟踪分支的差异
git log -p <本地分支名>..<远程跟踪分支名>
//例如:git log -p develop..origin/develop
合并远程跟踪分支的内容
git merge <远程跟踪分支名>
//例如:git merge origin/develop
同步远程分支
1.fetch
从远程分支获取最新版本到远程跟踪分支,如果不去合并的话,本地分支的内容不会改变。
git fetch <远程仓库名> <远程分支名> //从远程分支获取最新版本到远程跟踪分支
git merge <远程跟踪分支名> //从远程跟踪分支合并最新版本到本地分支
2.pull
pull = fetch + merge。
删除远程分支
git push <远程仓库名> :<远程分支名> //注意空格
//例如:git push origin :temp
重命名远程分支
先删除远程分支,然后重命名本地分支,接着再push到远程仓库。