Git -- 使用 -- 命令行

基本操作

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 diff 输出结果分析

查看提交历史记录

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到远程仓库。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 文章基于Mac版本的git操作. 关于 git. 之前一直使用SVN, 开发个人项目时会使用GitHub Desk...
    KenZhangCn阅读 3,290评论 0 0
  • 1.git init 2.git remote add origin [git地址] 1.先在远程库创建项目,然后...
    易海飞鱼阅读 2,880评论 0 0
  • 注:此次基础操作来源于stormzhang的资料《从+0+开始学习+GitHub+系列.pdf》,特在此感谢帅张的...
    Wolfog阅读 3,741评论 0 0
  • 第一部分:基础管理 1 创建版本库 $ git init 2 通过ls -a 查看,就可以看见 .git/文件夹 ...
    php红薯阅读 3,222评论 0 0
  • 一分钟目的 首先定一个长期的目标,把长期目标分为许多的小目标,年目标细分到月目标,月目标化为周目标,周目标最终分到...
    咕叽_5101阅读 2,682评论 0 0