git
基本概念
- 版本库 👉.git
- 当我们使用 git 管理文件时,比如 git init 时,这个时候,会多一个.git 文件,我们把这个文件称之为版本库。
- .git 文件另外一个作用就是它在创建的时候,会自动创建 master 分支,并且将 HEAD 指针指向 master 分支。
- 工作区
- 本地项目存放文件的位置
- 暂存区 (Index/Stage)
- 顾名思义就是暂时存放文件的地方,通过是通过 add 命令将工作区的文件添加到缓冲区
- 本地仓库(Repository)
- 通常情况下,我们使用 commit 命令可以将暂存区的文件添加到本地仓库
- 通常而言,HEAD 指针指向的就是 master 分支
- 远程仓库(Remote)
- 举个例子,当我们使用 GitHub 托管我们项目时,它就是一个远程仓库。
- 通常我们使用 clone 命令将远程仓库代码拷贝下来,本地代码更新后,通过 push 托送给远程仓库。
配置命令
列出当前配置
git config --list
列出 Repository 配置
git config --local --list
列出全局配置
git config --global --list
列出系统配置
git config --system --list
配置用户名
git config --global user.name "your name"
配置用户邮箱
git config --global user.email "youremail@github.com"
分支管理
查看本地分支
git branch
查看远程分支
git branch -r
查看本地和远程分支
git branch -a
切换分支
git checkout <branch-name>
创建并切换到新建分支
checkout -b <branch-name>
删除分支
git branch -d <branch-name>
当前分支与指定分支合并
git merge <branch-name>
查看哪些分支已经合并到当前分支
git branch --merged
查看哪些分支没有合并到当前分支
git branch --no-merged
- 查看各个分支最后一个提交对象的信息
git branch -v
- 删除远程分支
git push origin -d <branch-name>
- 重命名分支
git branch -m <oldbranch-name> <newbranch-name>
- 拉取远程分支并创建本地分支
git checkout -b 本地分支名x origin/远程分支名x
// 另外一种方式,也可以完成这个操作。
git fetch origin <branch-name>:<local-branch-name>
// fetch这个指令的话,后续会梳理
-d 就是删除,会检验分支内容是不是都被合并到别的分支了,这样免得把修改内容弄丢了。
-D 就是强制删除,不做检验。
fetch 命令
将远程仓库内容更新到本地(用到不多)
fetch 推荐写法
git fetch origin <branch-name>:<local-branch-name>
- 一般而言,这个 origin 是远程主机名,一般默认就是 origin。
- branch-name 你要拉取的分支
- local-branch-name 通常而言,就是你本地新建一个新分支,将 origin 下的某个分支代码下载到本地分支。
举个例子
git fetch origin feature/template_excellent:feature/template_layout
// 你的工作目录下,就会有feature/template_layout
fetch 其他写法
将某个远程主机的更新,全部取回本地。
git fetch <远程主机名>
这样子的话,取回的是所有的分支更新,如果想取回特定分支,可以指定分支名 👇
git fetch <远程主机名> <分支名>
当你想将某个分支的内容取回到本地下某个分支的
git fetch origin :<local-branch-name>
// 等价于👇
git fetch origin master:<local-branch-name>
撤销
撤销工作区修改(不懂)
git checkout --
暂存区文件撤销 (不覆盖工作区)
git reset HEAD
版本回退
git reset --(soft | mixed | hard ) < HEAD ~(num) > |
指令 | 作用范围 |
---|---|
–hard | 回退全部,包括 HEAD,index,working tree |
–mixed | 回退部分,包括 HEAD,index |
–soft | 只回退 HEAD |
状态查询
查看状态
git status
查看历史操作记录
git reflog
查看日志
git log
文档查询
展示 Git 命令大纲
git help (--help)
展示 Git 命令大纲全部列表
git help -a
展示具体命令说明手册
git help
文件暂存
添加改动到 stash
git stash save -a "给注释"
git stash //快捷命令
删除暂存
git stash drop <stash@{ID}>
查看 stash 列表
git stash list
删除全部缓存
git stash clear
恢复改动
git stash pop <stash@{ID}>
差异比较
比较工作区与缓存区
git diff
比较缓存区与本地库最近一次 commit 内容
git diff -- cached
比较工作区与本地最近一次 commit 内容
git diff HEAD
比较两个 commit 之间差异
git diff
基本操作
有了上述的基本了解后,那么我们就来看看整体的一个流程吧。
创建本地仓库
git init
链接本地仓库与远端仓库
git remote add origin <远程Git仓库地址>
origin默认是远端仓库别名 url 可以是可以使用https或者ssh的方式新建
username 与 email
git config --global user.name "yourname"
git config --global user.email "your_email"
生成秘钥
ssh-keygen -t rsa -C "这里换上你的邮箱"
cd ~/.ssh 里面有一个文件名为id_rsa.pub,把里面的内容复制到git库的我的SSHKEYs中
新建.ssh
提交到缓存区
git add . 全部上传到缓存区
git add 指定文件
提交到本地仓库
git commit -m 'some message'
提交远程仓库
git push <远程主机名> <本地分支名>:<远程分支名>
-f 可以强制执行
常用命令
查看远端仓库信息
git remote -v
远端仓库重新命名
git remote rename old new
合并分支
git merge dev --no-ff
退出注释
:q
查看日志
git log
问题
git -am 与 git -m
开发新功能时,需要切换另一分支修复 bug,又不想提交当前分支代码怎么办?
场景
当你正在修改 A 分支的代码,而此时 B 分支有紧急任务。
这时你需要切换到 B 分支先执行紧急任务。
但是,你的 A 分支代码又修改了一半,你不想提交一个 commit,该怎么办呢?
解决方案
A:直接抛弃当前修改,git rest –hard ,这个属于病急乱投医
B:匆忙提交当前代码,会多一个 commit 记录,让你的 git 凌乱不堪
C:通过 git stash 先将当前修改缓存下来,然后再切换分支,这个才是最优雅的方案
关于 git stash
运行 git stash 命令,git 会将当前代码以栈的形式缓存。
注:git stash 对新增的文件进行缓存是不起效果的,对于新增的文件,要进行缓存的话,需要先添加到暂存区(git add .)才可以进行缓存。
恢复
当 B 分支任务修改完后,切换回 A 分支,只需要使用 git stash apply 将暂存区的数据进行恢复。
$ git push origin HEAD –force 复制代码
本地代码提交跟远程冲突时,想强制覆盖远程代码该怎么办?
push -force 强制推送
众所周知,git 的 push -force 指令是不推荐被使用的,–force 会使用本地分支的提交覆盖远端推送分支的提交。也就是说,如果其他人在相同的分支推送了新的提交,你的这一举动将“删除”他的那些提交!所以这种只适合于你自己一人维护的分支强制推送,对于多人维护的分支,我们应该采用更加安全的方式。
–force-with-lease 更安全的方式
使用了 –force-with-lease 参数之后,上面那种安全问题就没有那么危险了。
使用此参数推送,如果远端有其他人推送了新的提交,那么推送将被拒绝,这种拒绝和没有加 –force 参数时的拒绝是一样的。
walterlv$ git push –force-with-lease To https://github.com/walterlv/walterlv.github.io.git ! [rejected] master -> master (fetch first) error: failed to push some refs to ‘https://github.com/walterlv/walterlv.github.io.git' 复制代码
请特别注意——如果你 fetch 之后在本地的 origin 相关分支上已经看到了别人的提交,依然进行强制推送,你还是会覆盖别人的提交。也就是说,–force-with-lease 解决的是本地仓库不够新时,依然覆盖了远端新仓库的问题,如果你执意想要覆盖远端提交,只需要先 fetch 再推送,它也不会拒绝的。
git 添加.gitignore 后不生效问题
该文件只能作用于 Untracked Files,也就是那些从来没有被 Git 记录过的文件(自添加以后,从未 add 及 commit 过的文件)。
之所以你的规则不生效,是因为那些 .log 文件曾经被 Git 记录过,因此.gitignore 对它们完全无效。
解决方法
从 Git 的数据库中删除对于该文件的追踪; git rm -r --cached .