# git
# git基础知识介绍
- 工作区:未被git管理起来的文件。
- 暂存区:在使用git管理项目文件的时候,其本地的项目文件会多出一个.git的文件夹,将这个.git文件夹称之为版本库。其中.git文件夹中包含了两个部分,一个是暂存区(Index或者Stage),顾名思义就是暂时存放文件的地方,通常使用add命令将工作区的文件添加到暂存区里。
- 本地仓库:.git文件夹里还包括git自动创建的master分支,并且将HEAD指针指向master分支。使用commit命令可以将暂存区中的文件添加到本地仓库中。
- 远程仓库:不是在本地仓库中,项目代码在远程git服务器上,比如项目放在github上,就是一个远程仓库,通常使用clone命令将远程仓库拷贝到本地仓库中,开发后推送到远程仓库中即可;
# git配置命令
查询配置信息
列出当前配置:
git config --list
;列出repository配置:
git config --local --list
;列出全局配置:
git config --global --list
;列出系统配置:
git config --system --list
;
配置用户信息1. 配置用户名:git config --global user.name "your name" 2. 配置用户邮箱:git config --global user.email "youremail@github.com"
配置ssh密钥1. ssh-keygen -t rsa 生成sshkey 2. 一直回车使用默认值 3. 查找公钥 1. window系统: C:\Users\用户\\.ssh\id_rsa.pub 2. MAC系统:命令行输入 cat ~/.ssh/id_rsa.pub 4. 将公钥加入GitHub的ssh中 5. 可以使用ssh拉代码啦 6. 有可能会碰到github说格式不正确的问题,这个时候试一下这两个命令去生成ssh,ssh-keygen -t ed25519 -C "your_email@example.com" 或者 ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# git基础
git init 初始化git管理文件
git clone <远程仓库url> 拉取一个远程仓库(适合本地啥都没有的情况)
工作区:有变动的文件or新增文件 红色
缓存区:经过 git add . 绿色
工作区提交代码到暂存区
git add . 提交工作区所有文件到暂存区
git add <dir> 添加指定目录到暂存区,包括子目录
git rm --cached <file> 将file文件从暂存区迁移到工作区 (未跟踪的状态,文件还在)
git restore --staged <file> 文件从staged -> unstage
git rm -f <file> 强制删除文件
git checkout -- <filename> 将工作区指定的文件恢复到上次commit的状态
暂存区提交到本地仓库
git commit -m "版本信息"
本地仓库提交到远程仓库
git push <远程仓库别名> <远程仓库分支>
查询信息
git status 查询当前工作区所有文件的状态
git diff 比较工作区中当前文件和暂存区之间的差异,也就是修改之后还没有暂存的内容
git diff --cache <file> 比较暂存区与上一版本的差异
git log 查看提交历史
git reflog 查看版本库(查看所有分支的所有操作记录,包括已经删除的)
git log --pretty=oneline --graph 以图的形式显示版本日志
# git提高
暂存区提交到本地仓库
git commit -m "版本信息"
git commit -am "版本信息" 相当于add+commit(将git跟踪的文件直接提交版本库,跳过暂存区,注意:新增的文件不会提交)
git commit --amend -m '***' 修改上次提交的信息
查询信息
git diff --cache 比较暂存区与上一版本的差异
git commit --amend <file1> <file2> 提交文件时,发现漏掉几个文件可以重新提交
git commit -v 提交时显示所有diff信息
git commit --amend -m '***' 修改上次提交的信息
打标签(用于特定结点,比如说版本上线)
git tag 列出所有标签
git tag -d [tag] 删除本地tag
git tag v1.0 创建标签
git push <remote> v1.0 将标签推送到远程仓库中
git push <remote> --tags 将本地所有的标签全部推送到远程仓库中
git push <remote> :refs/tags/[tagName] 删除远程tag
git show [tag] 查看tag信息
分支管理
git branch 显示本地仓库的所有分支
git branch -r 显示远程仓库的所有分支
git branch <branch-name> 创建分支
git checkout <branch-name> 切换到其他分支
git checkout -b <branch-name> 新建并切换到新建分支
git branch -d <branch-name> 删除本地分支
git branch -dr <remote/branch> 删除远程分支(用这个)
git push origin --delete [branch-name] 删除远程分支
git merge <branch-name> 将当前分支与指定分支进行合并
查看上游分支
git status 、git checkout <branch>、git branch -vv
设置上游分支
git branch --set-upstream-to=origin/main main 给本地main分支设置远程main分支作为上游分支(远程分支存在的情况)
git push set-upsteam origin HEAD:main 远程分支不存在的情况
取消上游分支
git branch --unset-upstream
git fetch <remote-name> <branch-name> 把远程分支拉倒本地(未合并)
git merge <remote-name> <branch-name> 把远程分支合并到当前分支
git checkout -b <branch-name> <remote-name> <branch-name>
创建新的本地分支并把远程分支设置为当前分支的上游分支(之后可以直接git pull和git push简写操作)
查询信息
git remote -v 查看本地仓库关联的远程仓库url地址
git remote add <remote-name> <url> 给远程仓库(url地址)取一个名字叫做remote-name
git remote set-url [--push] <name> <newurl> [<oldurl>] 重新设置远程仓库的url
git remote rename origin o 给远程仓库重命名
git diff --shortstat "@{0 day ago}" 显示今天你写了多少行代码
拉取远程仓库分支
git pull <remote-name> <branch-name>
撤销操作
版本库—>缓存区(绿色) git reset --soft 版本号(版本号可以用HEAD^来代替,表示上一个版本,撤销commit操作)
版本库->工作区的tracked位置(红色) git reset --mix 版本号
版本库->工作区的untracked位置 git reset --hard 版本号
缓存区->工作区的tracked位置(红色) 绿变红 git reset HEAD <file>
--soft:仅仅是撤回commit操作,您写的代码仍然保留
--mixed:不删除工作空间改动代码,撤销commit,并且撤销git add操作
--hard:删除工作空间改动代码,撤销commit,撤销git add,注意完成这个操作后,就恢复到了上一次的commit状态。
# git进阶
git stash 命令会将所有已提交到暂存区,以及没有提交的修改,都进行内部保存,没有将工作区恢复到上一次commit的状态。
git stash list 列出所有暂时保存的工作
git stash pop 恢复最近一次stash的文件
git stash drop 丢弃最近一次stash的文件
git stash clear 删除所有的stash
git stash apply stash@{1} 恢复某个暂时保存的工作
分支管理
merge
rebase
将一个分支里提交的改变移到基底分支上重放一遍:git rebase <rebase-branch> <branch-name>,如git rebase master server,将特性分支server提交的改变在基底分支master上重演一遍;使用rebase操作最大的好处是像在单个分支上操作的,提交的修改历史也是一根线;如果想把基于一个特性分支上的另一个特性分支变基到其他分支上,可以使用--onto操作:git rebase --onto <rebase-branch> <feature branch> <sub-feature-branch>,如git rebase --onto master server client;使用rebase操作应该遵循的原则是:一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行rebase操作
# 冲突
- 同一分支下pull或push:比如在同一个分支下,对本地的a文件做出了修改,此时我们在进行pull或push时如果远程分支下的a文件也有修改,那么代表本地和远程分支的代码是不同步的,此时也会引起冲突。
- 不同分支下的merge:两个分支下的同一个文件都有修改,这个时候两个分支不同步会产生冲突。
# 解决冲突
先将工作区文件暂存,再拉远程代码
- git stash
- git pull
- git stash pop 或者 git stash apply stash@{0}
- 找到冲突文件并解决
- add+commit提交
提交更改,然后再进行合并
- git add . + git commit -m "your commit message"
- 拉下远程代码手动解决冲突
- 最后push到远程
最好解决冲突的办法就是:每次写代码之前都从远程仓库拉取最新的代码
# 更新本地代码
git fetch upstream 拉下远程代码
git rebase upstream/mai 进行变基操作,同步代码
# git插件
git graph
参考目录:
阮一峰-常用 Git 命令清单 (opens new window) 阮一峰-ES6入门教程 (opens new window) 书栈网-Git命令大全 (opens new window) git常用命令 (opens new window) 各种工作场景的 git 指令大全 (opens new window) 廖雪峰Git教程 (opens new window) 面试题|git秘籍--多人协作冲突 (opens new window) git rebase,看这一篇就够了 (opens new window) git pull --rebase的正确使用 (opens new window)