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_rsassh-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/releasegit 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 refloggit 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,如果远程分支是与当前分支合并,则冒号后面的部分可以省略

浙公网安备 33010602011771号