git常用操作及常见问题解决

一、创建一个版本库,选择一个合适的地方,创建一个空目录:
$ mkdir learngit
$ cd learngit
$pwd
/root/test/learngit/
通过git init 命令将这个目录变成git可以管理的仓库:
[email protected]:~/test/learngit# git init
Reinitialized existing Git repository in /root/test/learngit/.git/

二、远程库设置
1.生成公钥私钥,提交到GitHub的ssh key里
$ ssh-****** -t rsa -C "15******[email protected]"
将.pub公钥提交到GitHub设置里面的ssh**管理。
2.在GitHub上新建repo,clone里面默认使用https提交同步,在虚拟机里面每次使用git push -u origin master同步都会提示输入账号密码,解决方案是修改clone的方式为ssh。
3.查看clone 地址:git remote -v,更换时需要先移除之前的https方式:git remote rm origin ;在GitHub上的对应库里面的clone or download里面把https切换为ssh。
4.git remote add origin [email protected]:zrjkop/learngit.git重新提交远程库设置;
5.git push origin master,同步数据。

另外的虚拟机在GitHub添加新的ssh key无法使用,无法clone远程库:
需要把生成的秘钥添加的ssh中,ssh-add id_rsa
ssh -T [email protected]测试连接:
会显示该秘钥可以访问的GitHub用户信息
Hi zrjkop! You've successfully authenticated, but GitHub does not provide shell access.
如果ssh-add不成功,请先 ssh-agent bash后在 ssh-add 即可
三、重装debian系统后(需要重新生成key并提交到GitHub)再次提交远程库出问题:
[email protected]:~/test/learngit# git push origin master
To github.com:zrjkop/learngit.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '[email protected]:zrjkop/learngit.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
解决方法:
1.使用强制push的方法,会把远程库数据强制清除,提交新数据
git push -u origin master -f
2.push前先将远程repository修改pull下来
git pull origin master之后再提交git push -u origin master
3.若不想merge远程和本地修改,可以先创建新的分支:
git branch [name]
然后push
git push -u origin [name]

四、添加,修改,提交
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
git status查看状态;
先add后修改文件,当前提交只会保存add之前的状态;
如果需要提交保存的第二次修改,可以再add一次文件,之后再commit一次。或者第一次修改 -> git add -> 第二次修改 -> git add -> git commit
1.git文件回滚
git log查看操作版本号,git reset --hard 1094a(版本号前面几位)
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。

穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
2.撤销修改
checkout
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。

五、git分支
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>

六、不同分支push后,合并merge时显示冲突解决(在本地各分支add后,commit再merge也应该是会提示冲突)
(一)针对push后在web进行merge的报错:
以分支new,提交合并到master为例
1.在分支new通过git push -u origin new后,网页上切换分支branch位置,通过new pull request进去merge界面;
2.会显示can't automatically merge,需要手动提交,点击create pull request;
3.下一个页面显示This branch has conflicts that must be resolved,点击resolve conflicts进入冲突文件详情;
4.会显示分支文件与master文件差异的地方,=====为分隔,<<<<<<<<new到======之间的内容为new分支的新内容,=====到>>>>>>master之间内容为master原有内容;
5.删除<<<<<< new 和=====以及>>>>master,编辑其差异部分内容,可以修改为最终master需要保持的版本,之后右上角保存返回,以此提交merge即可。

merge后一般可以删除分支new,如果继续保留分支new,在本地分支new编辑新内容再次提交时,push会报错,文件不一致,可以直接删除new分支,重新push后远端会再次生成new分支,只需考虑new和master合并的问题。

(二)在本地分支new和master都进行add和commit后,merge分支会提示冲突,可以vi 进到冲突文件,也是会提示=====分隔的差异内容,通过编辑后保存,最后merge合并。

另附git gui一些记录:

Git-gui通过clone复制远端库到本地,会同时把库的几个分支拷贝下来,一般会保留master,其他的分支,可以通过create branch创建,勾选match tracking branch name即同步远端分支名称和文件,之后可以切换分支和提交。

git常用操作及常见问题解决

在本地编辑修改库里面的文件后,git-gui界面里通过rescan会把所有修改过的文件添加到图形界面框内,右上角会提示文件改动对比,需要staged changed保存修改,之后commit,最后通过push同步到远端。

git常用操作及常见问题解决

在远端和本地文件一致的情况下,如远端和本地都有1.txt,且内容一样的文件,此时在本地修改1.txt,之后push到远端,能正常提交;但是如果,远端和本地的1.txt不一致,即1.txt在远端被修改过,本地的1.txt也被修改过,这时候直接push会报错,提示文件不一致,冲突无法提交,解决方案:一是 git pull origin master,先同步远端文件到本机,此时会提示有文件冲突,1.txt,vi进入文件会看到冲突内容,重新编辑后可以git add 和git commit,之后push正常。

git常用操作及常见问题解决

二是使用强制push的方法,会把远程库数据强制清除,提交新数据

git push -u origin master -f

三是若不想merge远程和本地修改,可以先创建新的分支:

git branch [name]

然后push

git push -u origin [name]    ###以新分支提交后,如果需要合并到master,在web端同样需要解决冲突问题,需要合并差异部分。

这里跟前面第三、第六说到的冲突问题一致,都需要解决冲突才能合并和push。