前言
这篇博客将记录使用 git 过程中常用的命令,以及 git 出现问题时的解决方案。
速查表
常用
配置 git 账户:
配置git 告诉其他开发者你是谁,怎么联系你。这些信息可以是全局的,也可以在单个项目中单独设置。
全局的配置文件位于~/.gitconfig
项目的配置文件位于<project>/.git/config
- 全局配置
git config --global user.name 'yourname'
git config --global user.email 'name.email.com'
- 单个项目配置
git config --local user.name 'yourname'
git config --local user.email 'name.email.com'
密钥种种:
- 1、查看是否有ssh key设置,进入.ssh目录,看是否有公钥和私钥文件。
cd ~/.ssh
- 2、生成密钥
ssh-keygen -t rsa -C "oulafen.email.com"
连续三个回车,如果不需要密码的话。
最终得到两个文件:id_rsa
和id_rsa.pub
,其中id_rsa.pub
是公钥,远程git服务器要求添加的ssh key就是这个文件里的内容。
windows下默认生成目录在/c/Users/xxxx_000/.ssh/
或者/c/Users/pc/.ssh/
中。
mac下默认生成目录在~/.ssh/
- 3、测试ssh key是否配置成功
ssh -T git@github.com
查看
git status #查看当前版本状态(是否修改)
git log # 显示提交日志
git log -1 # 显示1行日志 -n为n行
git log --stat # 显示提交日志及相关变动文件
git show dfb02 # 可只用commitid的前几位
git show HEAD # 显示HEAD提交日志
git show HEAD^ # 显示HEAD的父(上一个版本)的提交日志 ^^为上两个版本 ^5为上5个版本
分支
git branch #显示本地分支
git branch -a #显示所有分支
git branch -r #显示所有原创分支
git branch --merged #显示所有已合并到当前分支的分支
git branch --no-merged #显示所有未合并到当前分支的分支
git branch -m master master_copy #本地分支master改名为master_copy
git branch -d branchname #branchname(本分支修改已合并到其他分支)
git branch -D branchname #强制删除分支branchname
git checkout -b master_copy #从当前分支创建新分支master_copy并检出
git merge branchname #合并branchname分支至当前分支
git push origin master_copy #将当前分支push到远程master_copy分支,若没有,则新建
git fetch #获取所有远程分支(不更新本地分支,另需merge)
git fetch --prune #获取所有原创分支并清除服务器上已删掉的分支
git pull origin master #获取远程分支master并merge到当前分支
图形化显示项目历史
gitk
放弃修改 及 版本回退
git checkout bb.txt #bb.txt文件修改了并被git管理,可恢复到上一次没被修改前的状态
git checkout #git放弃对当前文件夹的所有文件的修改
git reset HEAD filename #从暂存区中移除文件
git reset --hard HEAD~3 #将最新的3次提交全部重置,就像没有提交过一样
git reset --hard {版本号} #彻底回退到指定版本
对新建项目的123操作
- 1、在远程git库上新建项目test,以库git.oschina为例
- 2、复制项目链接
git clone git@git.oschina.net:oulafen/test.git
- 3、本地执行
cd test
git init
#然后新建 .gitignore 文件,写上自己想过滤的文件
git add .
git commit -m 'first commit and add gitignore'
git push
问题总结
-
常规的提交流程是什么?
-
git push
之前进行git pull
操作,意思就是将本地修改提交到线上之前先将线上别人已提交的修改同步到本地,这样一般不会有冲突,pull的位置如下:
git add . //添加所有修改文件(不包括删除操作),若有删除的文件需执行 git add -u git commit -m 'balabala' git pull git push
-
-
git pull
更新本地代码时出现冲突怎么办?- 方法一:
把参与冲突模块的同学们叫一起,大家看着一起处理冲突文件;
冲突的文件长这样
将要保留的代码保留下来,不需要的果断删;//... <<<<<<< 后提交的balabala ======= 新提交的balabala >>>>>>> //...
处理过的代码,类似长这样:
之后再执行一遍提交流程就哦了。//... 后提交的balabala //...
- 方法二:使用git stash命令进行处理
git stash #先将本地修改存储起来 git stash list #查看保存的信息
其中stash@{0}
是刚才保存的标记。git pull #更新代码 git stash pop #还原暂存的内容
此时,系统会有类似
Auto-merging ...balabala...
的提示,意思就 是系统自动合并修改的内容,但是其中有冲突,需要解决其中的冲突。
打开冲突的文件,会看到如下类似的内容<<<<<<< Updates upstream balabala ======= balabala >>>>>>> Stashed changes
其中
<<<<<<< Updated upstream
和=======
之间的内容就是pull下来的内容,====
和>>>>> stashed changes
之间的内容就是本地修改的内容。
碰到这种情况,git也不知道哪行内容是需要的,所以要自行确定需要的内容。
与方法一类似,将不需要的内容删掉,然后正常的提交就可以了。执行完
git push
之后,报警warning: push.default is unset; its implicit value has changed in Git 2.0 from 'matching' to 'simple'.
,
具体如下:warning: push.default is unset; its implicit value has changed in Git 2.0 from 'matching' to 'simple'. To squelch this message and maintain the traditional behavior, use: git config --global push.default matching To squelch this message and adopt the new behavior now, use: git config --global push.default simple When push.default is set to 'matching', git will push local branches //... remote branch that 'git pull' uses to update the current branch. ...
根据提示,可进行两个操作
git config --global push.default matching
或者git config --global push.default simple
,两者区别如下:- 前者
git push
会把你本地所有分支push到名称相对应的远程主机上。这意味着可能你会在不经意间push一些你原本没打算push的分支; - 后者
git push
仅仅把当前所在分支push到从当初git pull
pull下来的那个对应分支上。
- 方法一: