Git 工具总结
配置SSH
公钥
使用SSH
公钥可以让电脑和码云通讯(我仓库放在码云)的时候使用安全连接(Git
的Remote
要使用SSH
地址)。
- 码云--->设置--->安全设置--->
ssh
公钥,先写个公钥的标题 - 命令行键入
ssh-keygen -t rsa -C 'xxxxxx@xxxx.com'
,生成ssh key
~/.ssh/id_rsa.pub
,获取到你的public key
- 复制生成的
public key
添加到步骤1
仓库中 ssh -T git@gitee.com
,首次使用需要确认并添加主机到本机SSH
可信列表。若返回Hi XXX! You've successfully authenticated
,则证明添加成功。
Git
配置多个SSH-Key
当有多个git
账号时,比如:一个gitee
,用于公司内部的工作开发。一个github
,用于自己进行一些开发活动。
ssh-keygen -t rsa -C 'xxxxx@company.com' -f ~/.ssh/gitee_id_rsa
ssh-keygen -t rsa -C 'xxxxx@qq.com' -f ~/.ssh/github_id_rsa
- 上面的命令如果报错,
Saving key "//.ssh/id_rsa" failed: No such file or directory
。 - 找到
git
的安装路径,进入文件夹\Git\bin
,双击sh.exe
,键入上面的命令,试一试。我是这样弄好的。 - 在
C:\Users\admin
文件夹中,会生成ssh
文件夹,里面有gitee_id_rsa
、gitee_id_ras.pub
、github_id_rsa
、gihub__id_ras.pub
。 - 在
ssh
文件夹中,创建config
文件。不是新建.config
,也不是新建txt
文本文档 ,而是直接新建一个无后缀的config
文件。键入(其中Host
和HostName
填写git
服务器的域名,IdentityFile
指定私钥的路径):
# gitee
Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitee_id_rsa
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github_id_rsa
- 测试,
ssh -T git@gitee.com
和ssh -T git@github.com
初始操作(设置用户名)
git config --global user.name "any name"
,设置全局project
的用户名。git config --global user.email "any email"
,设置全局project
的邮箱。git config --global --list
,查看当前用户的全局配置,包括用户名和邮箱。- 在
VS Code
中每次更新代码都会要输入账号密码,方便起见,可以配置一下让git
记住密码账号。git config --global credential.helper store
。
建立远程仓库链接及remote
相关配置
- 如果是从服务器
clone
下来的代码,会自动配置一个叫origin
的远程仓库链接 git remote -v
,查看配置的远程仓库链接git remote add <远程仓库名> <远程仓库url>
,添加远程库链接git remote rm <远程仓库名>
,移除远程仓库git remote rename <旧名字> <新名字>
,远程仓库重命名
代码克隆所有分支
`git clone`只能`clone`远程库的`master`分支,无法`clone`所有分支,解决方法去下:
git clone http://xxx.xxx.com/project/.git
,这样在git_work
目录下得到一个project
子目录。cd project
。git branch -a
,列出所有分支名称如下:remotes/origin/dev remotes/origin/release
git checkout -b dev origin/dev
,作用是checkout
远程的dev
分支,在本地起名为dev
分支,并切换到本地的dev
分支。git checkout -b release origin/release
,作用参见上一步解释。git checkout dev
,切换回dev
分支,并开始开发。
拉取代码出现冲突
git pull
时本地文件和远程服务器文件冲突,出错信息如下:
error: Your local changes to 'contextTempl.java' would be overwritten by merge. Aborting.
Please, commit your changes or stash them before you can merge.
- 解释:这个意思是说更新下来的内容和本地修改的内容有冲突,先提交你的改变或者先将本地修改暂时存储起来。
- 在
VS Code
中,错误提示是:在签出前,请清理存储库工作树
。 - 在这种情况下,您可以将更改隐藏起来,然后执行
git pull
,然后解压缩。 git stash
,先将本地修改存储起来。git pull
,拉取远程。git stash pop
,还原暂存内容。
提交代码过程
- 提交之前,需要
git pull
一下,然后处理冲突。 git add -A
,添加所有文件。git add .
,也可以只添加更改的文件。git commit -m "描述代码信息"
。git push -u <远程库的名称> <远程库的分支>
,-u
表示指定<当前远程库>
为默认远程仓库,以后就直接push
,不用带参数。- 如果你确定远程仓库的分支上那些代码都不需要了,那么直接
push
后面加一个-f
,强行让本地分支覆盖远程分支。 git push <远程仓库名> <远程库的分支> -f
。
提交代码出现冲突
git push
会出问题,应该先git pull
一下,但是git pull
的时候又可能会出现分支冲突。- 这时可能由于版本问题会报错,可能遇到
refusing to merge unrelated histories
这个提示是因为两个仓库不同,发现refusing to merge unrelated histories
,无法git pull
。 - 要把两个不同的项目合并,
git
需要添加一句代码,这句代码是在git 2.9.2
版本发生的,最新的版本需要添加--allow-unrelated-histories
。查看git
版本,git --version
。 - 假如我们的远程仓库是
origin
,分支是master
,那么我们需要这样写git pull origin master --allow-unrelated-histories
。 - 然后再
git push -u <远程库的名称> <远程库的分支>
。 - 新建的项目,第一次上传的时候,也会出现相同的问题,直接强制上传,
git push <远程仓库名> <远程库的分支> -f
。
分支操作
git branch
,查看分支。git branch <name>
,创建分支。git checkout <name>
,切换分支。git checkout -b <name>
,创建并切换分支。git merge <name>
,合并某分支到当前分支。git branch -d <name>
,删除分支。
当前分支从另一分支合并指定文件
如何从一个分支合并特定的文件到另一个分支。其实,只合并你需要的那个`commit`,不需要的`commits`就不用合并进去了。
合并某个分支上的单个commit
比如`feature`分支上的`commit 82ecb31`非常重要,它含有一个`bug`的修改,或其他人想访问的内容。无论什么原因,你现在只需要将`82ecb31`合并到`master`,而不合并`feature`上的其他`commits`,所以我们用`git cherry-pick`命令来做:
git checkout feature
,切换到feature
分支- 首先在
feature
分支上,用git log
查看一下你想选择哪个commit
进行合并,记住commit id
,比如:82ecb31
- 切换到
master
分支,git checkout master
git cherry-pick 82ecb31
,ok了- 如果
git
不能合并代码改动(比如遇到合并冲突),git
需要你自己来解决冲突并手动添加commit
。
合并某个分支上的一系列commits
在一些特性情况下,合并单个`commit`并不够,你需要合并一系列相连的`commits`。这种情况下就不要选择`cherry-pick`了,`rebase`更适合。
假设你需要合并`feature`分支的`commit76cada ~62ecb3`到`master`分支。
- 首先需要基于
feature
创建一个新的分支,并指明新分支的最后一个commit
git checkout featuregit
git checkout -b newbranch 62ecb3
- 然后,
rebase
这个新分支的commit
到master(--ontomaster)
。76cada^
指明你想从哪个特定的commit
开始。
git rebase --ontomaster 76cada^
- 得到的结果就是feature分支的commit 76cada ~62ecb3 都被合并到了master分支。
指令简写
-d
,--delete
,删除-D
,--delete --force
,强制删除-f
,--force
,强制-m
,--move
,移动或重命名-M
,--move --force
,强制移动-r
,--remote
,远程-a
,--all
,所有
撤销与恢复
- 如果误删了某文件,需要
git status
先看下工作区是否commit
过,如果没有commit
,可以看到删除的文件名及路径,是红色的。 - 直接从工作区拿删除的文件
git checkout -- <path + file>
。 - 如果已经
commit
了,那么git status
看到的删除的文件及路径是绿色的,这时checkout
已经没用了。 - 可以把暂存区的修改撤销掉
(unstage)
,git reset HEAD <path + file>
,重新放回工作区,然后git checkout -- <path + file>
取回。
版本回退
远程分支回退有三种方法:
- 自己的分支回滚直接用
reset
- 公共分支回滚用
revert
- 错的太远了直接将代码全部删掉,用正确代码替代
本地分支版本回退:
- 先找到要回退的版本的
commit id
,命令git reflog
- 可以根据
commit id
,查看先前版本的信息,git log <commit id>
或者git show <commit id>
。退出git log
状态,英文状态下按q
- 回退版本
git reset --hard <commit id>
自己的远程分支版本退回:
如果你的错误提交已经推送到自己的远程分支了,那么就需要回滚远程分支了。
git reflog
git reset --hard <commit id>
- 然后强制推送到远程分支,
git push -f
- 本地分支回滚后,版本将落后远程分支,必须使用强制推送覆盖远程分支,否则无法推送到远程分支
公共远程分支回退:
回滚公共远程分支和回滚自己的远程分支是有区别的,如果你回退公共远程分支,把别人的提交给丢掉了怎么办?
git fetch 和 git pull 的区别
git fetch <远程主机名> <分支名>
- 最常见的命令如取回
origin
主机master
分支 git fetch origin master
,从远程主机的master
分支拉取最新内容git merge FETCH_HEAD
,将拉取下来的最新内容合并到当前所在的分支中git pull <远程主机名> <远程分支名>:<本地分支名>
git pull origin master
,如果远程分支是与当前分支合并,则冒号后面的部分可以省略