「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!」前端
做为一名工程师,既然想要加入一个团队,并肩做战地协同开发项目,就必不可少要学会Git基本操做。面试过程当中,面试官不止是考察1-3年的工程师,高级岗位也一样会考察团队协做的能力。相信小伙伴们常常会在面试中被问到如下问题吧,能够帮助你测试一下你的Git基础牢不牢固。git
git fetch
和git pull
有什么区别,有合并操做吗?git merge
和git rebase
有什么区别,它们的应用场景有哪些?git reset
和git revert
有什么区别,该如何选择,回滚后的<commit-id>
还能找到吗?若是你心中已有答案,那么能够选择跳过这篇文章啦,愉快地继续摸鱼~github
若是你对这些概念还有些模糊,或者没有实际操做过,那么就须要好好阅读本篇文章啦!面试
接下来立刻进入正文啦,本文分四个部分介绍,你们能够自由选择阅读。后端
画了一个简单的示意图,供你们参考缓存
git add
后,工做区的文件就会被移入暂存区,表示哪些文件准备被提交,当完成某个功能后须要提交代码,能够经过 git add
先提交到暂存区。如下命令远程主机名默认为origin
,若是有其余远程主机,将origin
替换为其余便可。bash
# 获取远程仓库特定分支的更新
git fetch origin <分支名>
# 获取远程仓库全部分支的更新
git fetch --all
复制代码
# 从远程仓库拉取代码,并合并到本地,至关于 git fetch && git merge
git pull origin <远程分支名>:<本地分支名>
# 拉取后,使用rebase的模式进行合并
git pull --rebase origin <远程分支名>:<本地分支名>
复制代码
注意服务器
git fetch + git merge FETCH_HEAD
,执行效果就是会拉取全部分支信息回来,可是只合并当前分支的更改。其余分支的变动没有执行合并。# 基于当前分支,新建一个本地分支,但不切换
git branch <branch-name>
# 查看本地分支
git branch
# 查看远程分支
git branch -r
# 查看本地和远程分支
git branch -a
# 删除本地分支
git branch -D <branch-name>
# 基于旧分支建立一个新分支
git branch <new-branch-name> <old-branch-name>
# 基于某提交点建立一个新分支
git branch <new-branch-name> <commit-id>
# 从新命名分支
git branch -m <old-branch-name> <new-branch-name>
复制代码
# 切换到某个分支上
git checkout <branch-name>
# 基于当前分支,建立一个分支并切换到新分支上
git checkout -b <branch-name>
复制代码
# 添把当前工做区修改的文件添加到暂存区,多个文件能够用空格隔开
git add xxx
# 添加当前工做区修改的全部文件到暂存区
git add .
复制代码
# 提交暂存区中的全部文件,并写下提交的概要信息
git commit -m "message"
# 相等于 git add . && git commit -m
git commit -am
# 对最近一次的提交的信息进行修改,此操做会修改commit的hash值
git commit --amend
复制代码
# 推送提交到远程仓库
git push
# 强行推送到远程仓库
git push -f
复制代码
# 查看全部已打上的标签
git tag
# 新增一个标签打在当前提交点上,并写上标签信息
git tag -a <version> -m 'message'
# 为指定提交点打上标签
git tag -a <version> <commit-id>
# 删除指定标签
git tag -d <version>
复制代码
HEAD表示最新提交 ;HEAD^表示上一次; HEAD~n表示第n次(从0开始,表示最近一次)markdown
git pull
拉取远程仓库的最新代码git add .
添加修改的文件到暂存区git commit -m 'message'
提交到本地仓库git push
将本地仓库的修改推送到远程仓库自动建立一个新的合并提交点merge-commit
,且包含两个分支记录。若是合并的时候遇到冲突,仅须要修改解决冲突后,从新commit。app
git checkout master
git merge dev
复制代码
git merge --ff
(默认--ff,fast-farward)
git merge --no-ff
(不快速合并、推荐)
git merge --squash
(把屡次分支commit历史压缩为一次)
merge commit
,变换起始点位置,“整理”成一条直线,且能使用命令合并屡次commit。git rebase master
就会拉取到master上的最新代码合并进来,也就是将分支的起始时间指向master上最新的commit上。自动保留的最新近的修改,不会遇到合并冲突。并且可交互操做(执行合并删除commit),可经过交互式变基来合并分支以前的commit历史git rebase -i HEAD~3
git rebase master
整理本身的dev变成一条线。频繁进行了git commit提交,可用交互操做drop
删除一些提交,squash
提交融合前一个提交中。git checkout dev
git rebase master
复制代码
git rebase master
,将dev的屡次commit一块儿拉到要master最新提交的后面(时间最新),变成一条线,多用于整理本身的dev提交历史,而后把master最新代码合进来。git merge feature-a
git rebase dev
# 取消merge合并
git merge --abort
# 取消rebase合并
git rebase --abort
复制代码
git checkout
git reset
--hard
:硬重置,影响【工做区、暂存区、本地仓库】--mixed
:默认,影响【暂存区、本地仓库】,被重置的修改内容还留在工做区--soft
:软重置,影响 【本地仓库】,被重置的修改内容还留在工做区和暂存区git revert
# 撤回工做区该文件的修改,多个文件用空格隔开
git checkout -- <file-name>
# 撤回工做区全部改动
git checkout .
# 放弃已git add到暂存区的指定文件的缓存(HEAD表示最新版本)
git reset HEAD <file-name>
# 放弃全部的缓存
git reset HEAD .
# 丢弃已commit的其余版本,hard参数表示同时重置工做区的修改
git reset --hard <commit-id>
# 回到上一个commit的版本,hard参数表示同时重置工做区的修改
git reset --hard HEAD^
# 撤销0ffaacc此次提交
git revert 0ffaacc
# 撤销最近一次提交
git revert HEAD
# 撤销最近2次提交,注意:数字从0开始
git revert HEAD~1
# 回退后要执行强制推送远程分支
git push -f
复制代码
git cherry-pick
git merge
将全部提交点合并进来,就须要使用这个git cherry-pick
。git cherry-pick <commit-id>
复制代码
git stash
# 将本地改动的暂存起来
git stash
# 将未跟踪的文件暂存(另外一种方式是先将新增的文件添加到暂存区,使其被git跟踪,就能够直接git stash)
git stash -u
# 添加本次暂存的备注,方便查找。
git stash save "message"
# 应用暂存的更改
git stash apply
# 删除暂存
git stash drop
# 应用暂存的更改,而后删除该暂存,等价于git stash apply + git stash drop
git stash pop
# 删除全部缓存
git stash clear
# 查看缓存列表
git stash list
复制代码
git log
能够显示全部提交过的版本信息,若是感受太繁琐,能够加上参数 --pretty=oneline
,只会显示版本号和提交时的备注信息。
git reflog
git reflog
能够查看全部分支的全部操做记录(包括已经被删除的 commit 记录和 reset 的操做),例如执行 git reset --hard HEAD~1
,退回到上一个版本,用git log是看不出来被删除的,用git reflog
则能够看到被删除的,咱们就能够买后悔药,恢复到被删除的那个版本。
ssh-keygen -t rsa -C "邮箱地址"
cd ~/.ssh
切换到home下面的ssh目录、cat id_rsa.pub
命令查看公钥的内容,而后复制settings
-> SSH and GPG keys
-> 复制刚才的内容贴入 -> Add SSH key
git config --global user.name "xxx"
git config --global user.email "xxx@xx.com"
阅读到这里,是否是感受对Git相关概念更加清晰了呢,那么恭喜你,不再怕由于误操做,丢失同事辛辛苦苦写的代码了,并且将在平常工做的协同中游刃有余。