【git】第1篇:git面试以及经常使用命令操做

Git面试问题总结

git fetch和git pull的区别

  • git pull = fetch + merge
  • 使用git fetch是取回全部的最新的远程分支更新,不会对本地执行merge操做,本地内容不会有变更;
  • git pull会更新你本地代码变成服务器上对应分支的最新版本代码;

git merge和git rebase的区别

参考答案:git merge和git rebase的区别html

git reset、git revert 和 git checkout 有什么区别

这个问题一样也须要先了解 git 仓库的三个组成部分:工做区(Working Directory)、暂存区(Stage)和历史记录区(History)。git

共同点

用来撤销代码仓库中的某些更改。面试

不一样点

从 commit 层面来讲:

git reset 能够将一个分支的末端指向以前的一个 commit 点。而后再下次 git 执行垃圾回收的时候,会把这个 commit 以后的 commit 都扔掉。git reset 还支持三种标记,用来标记 reset 指令影响的范围:安全

--mixed:会影响到暂存区和历史记录区。也是默认选项;服务器

--soft:只影响历史记录区;app

--hard:影响工做区、暂存区和历史记录区。fetch

注意:由于 git reset 是直接删除 commit 记录,从而会影响到其余开发人员的分支,因此不要在公共分支(好比 develop)作这个操做。.net

git revert 和 git reset 的目的是同样的,可是作法不一样,它会以建立新的 commit 的方式来撤销 commit,这样能保留以前的 commit 历史,比较安全。另外,一样由于可能会覆盖本地的修改,因此执行这个指令以前,你须要 stash 或者 commit 暂存区和工做区的更改。code

git checkout 能够将 HEAD 移到一个新的分支,并更新工做目录。由于可能会覆盖本地的修改,因此执行这个指令以前,你须要 stash 或者 commit 暂存区和工做区的更改。server

从文件层面来讲

git reset 只是把文件从历史记录区拿到暂存区,不影响工做区的内容,并且不支持 --mixed、--soft 和 --hard。

git checkout 则是把文件从历史记录拿到工做区,不影响暂存区的内容。

git revert 不支持文件层面的操做。

回答关键点:

  • 对于 commit 层面和文件层面,这三个指令自己功能差异很大。
  • git revert 不支持文件层面的操做。
  • 不要在公共分支作 git reset 操做。

Git命令

Git配置相关

/*设置用户的姓名,用于每次的commit*/
git config - - global user.name "John Simth"
/*设置用户的邮箱,用于每次的commit*/
git config - - global user.email john@example.com

Git仓库的建立

/*将现有的项目转变为Git仓库或者新建一个空的仓库*/
git init
/*克隆仓库*/
git clone '远程仓库地址'

Git的基本操做

提交

/*将单个文件添加到暂存区中*/
git add 'filename'
/*将当前全部文件添加到暂存区中*/
git add .
/*提交文件*/
git commit -m "comment"
/*添加并提交文件*/
git commit -a -m "comment"

Git分支操做

建立、删除分支

git branch                    //查看全部分支
git branch <name>             //建立分支
git checkout <name>           //切换分支
git checkout -b <name>        //建立并切换分支

git branch -d <name>          //删除分支,没法删除未被合并的分支
git branch -D <name>          //强制删除分支,能够删除未被合并的分支

分支合并

git merge <branch>             //将branch分支合并到当前分支,当前分支拥有branch分支的记录,branch分支不变
git merge <branch1> <branch2>  //将分支branch1合并到branch2
/*git默认使用fast-farward快合并模式,会直接将要被合并的分支指向当前分支;
 *可是--no-ff不会,它会建立合并点;
 **/
git merge --no-ff <branch>
/*将两个分支合并成一个线性的提交*/
git rebase <branch>

git merge和git rebase的区别

查看状态或记录

/**
 *显示文件的状态: staged,unstaged和untracked三种状态
 *untracked:表示版本库中有新建立的文件,可是并为归入版本库的管理中
 *unstaged:将untracked状态的文件执行 git add 命令后文件状态就是unstaged,此时 
 *意味着git发现这个文件被改动了,可是改动的部分并无提交到仓库中
 *staged:表示文件已经被提交到仓库中了
 **/
git status
/*显示当前分支的commit记录*/
git log
/*以图的形式显示当前分支的commit记录*/
git log --graph

比较

/*工做区与暂存区之间的差异,即尚未添加到暂存区的修改,这里比较的是修改内容*/
git diff
/*暂存区与上一次提交的差异*/
git diff --cached
/*比较两次commit之间的差异*/
git diff <commit id1> <commit id2>
/*比较两个分支之间的差异*/
git diff <branch1> <branch2>

回退

/*将HEAD移动到commit id对应的提交点*/
git reset <commit id>
/*工做区、暂存区和历史记录区都会被重置commit id提交点*/
git reset --hard <commit id>

撤销

保存修改

git stash                     //保存当前工做区和暂存区的状态
git stash list                //查看全部的stash信息
git stash apply <stash>       //回复指定stash,但不删除该stash记录
git stash drop <stash>        //删除指定stash
git stash clear               //删除全部stash记录

标签

git tag <name>                 //给最新提交打标签
git tag <name> <commit_hash>   //给commit_hash提交打标签
git tag                        //查看全部标签
git show <name>                //查看标签信息
git checkout <tagname>         //切换到标签
git tag -d <tagname>           //能够删除一个本地标签
 
git push --tags                //把本地tag push到远端
git fetch origin tag <tagname> //获取远程tag
git push origin --delete tag <tagname>  //删除远程tag

Git远程仓库操做

关联远程仓库

git remote add origin git@server-name:path/repo-name.git
git push -u origin master
git push origin master
相关文章
相关标签/搜索