Git
# Git
# 简介
Git 是分布式版本控制系统,没有“中央服务器”。
# 配置
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
2
# 内容
# 基础知识
工作区
本地文件目录。
暂存区
git add
将工作区要添加的文件放到暂存区stage
。git commit
将暂存区的文件提交到当前分支(默认master
)。版本库
.git
目录即为 Git 的版本库,其里面有暂存区、默认分支master
和指向master
的指针HEAD
。
# 基本流程
# 创建版本库
git init
# 把文件添加到仓库
git add <file>
git add readme.txt
2
# 把文件提交到仓库
git commit -m <message>
git commit -m 'wrote a readme file'
2
复制相同提交内容
git cherry-pick <commit_id>
// commit_id只需要前7位
2
# 查看工作区状态
git status
# 日志
# 提交日志
git log
命令显示的是从最近到最远的提交日志。版本号commit id
由 SHA1 计算出的。
普通
git log
1简易
git log --pretty=oneline
1视图
git log --graph
1
# 命令日志
该命令可以帮助我们回到未来的版本。
git reflog
# 修改
# 撤销工作区的修改
git checkout -- <file>
有两种情况
- 工作区修改,但未提交到暂存区。此时,执行命令后将和版本库一模一样。
- 第一次修改提交到暂存区后,工作区又存在修改。此时,执行命令后将回到第一次修改提交到暂存区的状态。
原理:将版本库的版本替换到工作区。
# 撤销暂存区的修改
撤销暂存区的修改,重新回到工作区,工作区不变。
git reset head <file>
# 缓存未提交的修改
未提交的修改包括工作区和暂存区,将其存放在堆栈中,用于后续恢复。
基本操作
缓存
git stash
1查看缓存记录
git stash list
1恢复缓存
删除 stash 内容
git stash pop
1不删除 stash 内容
git stash apply
1指定恢复哪个缓存
git stash apply num
1
# 删除
版本库中删除文件
git rm file
工作区删除文件
rm file
# 远程仓库
关联远程库
git remote add name git@server-name:path/repo-name.git
git remote add origin git@github.com:aisuandebowen/learngit.git
2
name
:指定远程库名字,例如 origin。
# 本地替换远程
git push --force
# 合并远程分支
git pull
git fetch
2
3
问题:fetch和pull的区别
- git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
- git pull是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。
# 推送并将本地分支和远程分支关联
git push -u origin master
# 查看远程库信息
git remote -v
# 删除与远程库的关联
git remote rm origin
# 克隆仓库
git clone
# 本地分支和远程分支设置关联
git branch --set-upstream-to=origin/<branch-name> <branch-name>
# 分支 branch
# 查看分支
git branch
# 创建分支
git branch <name>
# 切换分支
// 两个都可以,推荐第一个。
git switch <name>
git checkout <name>
2
3
# 创建并切换分支
git switch -c <name>
git checkout -b <name>
2
# 合并某分支到当前分支
git merge <name>
冲突解决方案:当 Git 无法进行快速合并时,需要手动更改,Git 用<<<<<<<
,=======
,>>>>>>>
标记不同的内容。
--no-ff
参数
git merge --no-ff -m "merge with no-ff" dev
以上命令,将会合并并提交一个 commit。合并分支推荐使用普通模式--no-ff
,因为快速模式合并没有历史。
# 删除分支
git branch -d <name>
当要删除的分支没有被合并过,是无法删除的。此时一定要删除的话推荐:
git branch -D <name>
# 查看commit id属于哪个分支
git branch --contains <commit id>
git branch --contains <commit id> -r // 加远程
2
# 变基rebase
# 命令
git rebase
# 原理
场景:现有分支A、B。当前分支A,准备rebase B
。
内部过程:
- 取消A分支的所有
commit
; - 将过程1的操作临时保存成
patch
文件,保存在.git/rebase
目录下; - 然后,把
A
分支更新到最新的B
分支; - 最后,把上面保存的
patch
文件应用到A
分支上。
# 用途
# 多次提交合并
git rebase HEAD~{n}
# 分支合并
git rebase master
相比merge
优点,历史记录更清晰。
# 注意事项
# 异常退出vi
恢复方法:
git rebase --edit-todo
# 出现冲突时
- 解决冲突;
git add
更新;git rebase --continue
继续变基编辑。
# 终止编辑
git rebase --abort
# merge和rebase的区别
# merge
通过merge合并分支会新增一个merge commit,然后将两个分支的历史联系起来
其实是一种非破坏性的操作,对现有分支不会以任何方式被更改,但是会导致历史记录相对复杂
# rebase
rebase会将整个分支移动到另一个分支上,有效地整合了所有分支上的提交
主要的好处是历史记录更加清晰,是在原有提交的基础上将差异内容反映进去,消除了 git merge所需的不必要的合并提交
# 标签 Tag
标签本质是指向某次提交 commit,方便使用。因为平常使用commit_id
不方便!!!
# 创建标签
以最新提交的 commit 为准,创建标签。
git tag <tag-name>
1创建带有说明、指定
commit-id
的标签。git tag -a <tag-name> -m <message> <commit-id>
1注意:标签总是和某个 commit 挂钩。如果这个 commit 既出现在 master 分支,又出现在 dev 分支,那么在这两个分支上都可以看到这个标签。
# 显示已有标签
git tag
显示指定标签详细信息
git show <tag-name>
# 删除标签
本地
git tag -d <tag-name>
1远程
git push origin :refs/tags/<tag-name>
1
# 推送标签到远程
推送一个标签
git push origin <tag-name>
1推送所有标签
git push origin --tags
1
# 忽略特殊文件 ignore
# 正常操作
新建
.ignore
文件。填写规则
单个特殊文件
全称文件名。
有特点的特殊文件
如
.class
文件,可以使用通配符*
来表示,即*.class
。如果不想此规则忽略某个文件,可以
!文件名
,如!localConfig.txt
。
# 特殊操作
强制添加被 ignore 限制的文件
git add App.class -f
1查看限制某文件的具体命令所在
git check-ignore -v 文件名
1