Git 工具总结

配置SSH公钥

  使用SSH公钥可以让电脑和码云通讯(我仓库放在码云)的时候使用安全连接(GitRemote要使用SSH地址)。

  1. 码云--->设置--->安全设置--->ssh公钥,先写个公钥的标题
  2. 命令行键入ssh-keygen -t rsa -C 'xxxxxx@xxxx.com',生成ssh key
  3. ~/.ssh/id_rsa.pub ,获取到你的public key
  4. 复制生成的public key 添加到步骤1仓库中
  5. ssh -T git@gitee.com,首次使用需要确认并添加主机到本机SSH可信列表。若返回Hi XXX! You've successfully authenticated,则证明添加成功。

Git配置多个SSH-Key

  当有多个git账号时,比如:一个gitee,用于公司内部的工作开发。一个github,用于自己进行一些开发活动。

  1. ssh-keygen -t rsa -C 'xxxxx@company.com' -f ~/.ssh/gitee_id_rsa
  2. ssh-keygen -t rsa -C 'xxxxx@qq.com' -f ~/.ssh/github_id_rsa
  3. 上面的命令如果报错,Saving key "//.ssh/id_rsa" failed: No such file or directory
  4. 找到git的安装路径,进入文件夹\Git\bin,双击sh.exe,键入上面的命令,试一试。我是这样弄好的。
  5. C:\Users\admin文件夹中,会生成ssh文件夹,里面有gitee_id_rsagitee_id_ras.pubgithub_id_rsagihub__id_ras.pub
  6. ssh文件夹中,创建config文件。不是新建.config,也不是新建txt文本文档 ,而是直接新建一个无后缀的config文件。键入(其中HostHostName填写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
  1. 测试,ssh -T git@gitee.comssh -T git@github.com
      

初始操作(设置用户名)

  1. git config --global user.name "any name",设置全局project的用户名。
  2. git config --global user.email "any email",设置全局project的邮箱。
  3. git config --global --list,查看当前用户的全局配置,包括用户名和邮箱。
  4. VS Code中每次更新代码都会要输入账号密码,方便起见,可以配置一下让 git 记住密码账号。git config --global credential.helper store

建立远程仓库链接及remote相关配置

  1. 如果是从服务器 clone 下来的代码,会自动配置一个叫 origin 的远程仓库链接
  2. git remote -v,查看配置的远程仓库链接
  3. git remote add <远程仓库名> <远程仓库url>,添加远程库链接
  4. git remote rm <远程仓库名>,移除远程仓库
  5. git remote rename <旧名字> <新名字>,远程仓库重命名

代码克隆所有分支

`git clone`只能`clone`远程库的`master`分支,无法`clone`所有分支,解决方法去下:
  1. git clone http://xxx.xxx.com/project/.git ,这样在git_work目录下得到一个project子目录。
  2. cd project
  3. git branch -a,列出所有分支名称如下:
    remotes/origin/dev     
    remotes/origin/release
    
  4. git checkout -b dev origin/dev,作用是checkout远程的dev分支,在本地起名为dev分支,并切换到本地的dev分支。
  5. git checkout -b release origin/release,作用参见上一步解释。
  6. git checkout dev,切换回dev分支,并开始开发。

拉取代码出现冲突

  1. 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.
  1. 解释:这个意思是说更新下来的内容和本地修改的内容有冲突,先提交你的改变或者先将本地修改暂时存储起来。
  2. VS Code中,错误提示是:在签出前,请清理存储库工作树
  3. 在这种情况下,您可以将更改隐藏起来,然后执行git pull,然后解压缩。
  4. git stash,先将本地修改存储起来。
  5. git pull,拉取远程。
  6. git stash pop,还原暂存内容。

提交代码过程

  1. 提交之前,需要git pull一下,然后处理冲突。
  2. git add -A,添加所有文件。
  3. git add .,也可以只添加更改的文件。
  4. git commit -m "描述代码信息"
  5. git push -u <远程库的名称> <远程库的分支>-u 表示指定<当前远程库>为默认远程仓库,以后就直接push,不用带参数。
  6. 如果你确定远程仓库的分支上那些代码都不需要了,那么直接push后面加一个-f,强行让本地分支覆盖远程分支。
  7. git push <远程仓库名> <远程库的分支> -f

提交代码出现冲突

  1. git push 会出问题,应该先git pull一下,但是git pull的时候又可能会出现分支冲突。
  2. 这时可能由于版本问题会报错,可能遇到refusing to merge unrelated histories这个提示是因为两个仓库不同,发现 refusing to merge unrelated histories,无法git pull
  3. 要把两个不同的项目合并,git需要添加一句代码,这句代码是在git 2.9.2版本发生的,最新的版本需要添加 --allow-unrelated-histories。查看git版本,git --version
  4. 假如我们的远程仓库是 origin,分支是 master,那么我们需要这样写git pull origin master --allow-unrelated-histories
  5. 然后再git push -u <远程库的名称> <远程库的分支>
  6. 新建的项目,第一次上传的时候,也会出现相同的问题,直接强制上传,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`命令来做:
  1. git checkout feature,切换到feature分支
  2. 首先在feature分支上,用git log查看一下你想选择哪个commit进行合并,记住commit id,比如:82ecb31
  3. 切换到master分支,git checkout master
  4. git cherry-pick 82ecb31,ok了
  5. 如果git不能合并代码改动(比如遇到合并冲突),git需要你自己来解决冲突并手动添加commit

合并某个分支上的一系列commits

在一些特性情况下,合并单个`commit`并不够,你需要合并一系列相连的`commits`。这种情况下就不要选择`cherry-pick`了,`rebase`更适合。
假设你需要合并`feature`分支的`commit76cada ~62ecb3`到`master`分支。
  • 首先需要基于feature创建一个新的分支,并指明新分支的最后一个commit
git checkout featuregit 
git checkout -b newbranch 62ecb3
  • 然后,rebase这个新分支的commitmaster(--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,所有

撤销与恢复

  1. 如果误删了某文件,需要git status先看下工作区是否commit过,如果没有commit,可以看到删除的文件名及路径,是红色的。
  2. 直接从工作区拿删除的文件git checkout -- <path + file>
  3. 如果已经commit了,那么git status 看到的删除的文件及路径是绿色的,这时checkout已经没用了。
  4. 可以把暂存区的修改撤销掉(unstage)git reset HEAD <path + file>,重新放回工作区,然后git checkout -- <path + file>取回。

版本回退

远程分支回退有三种方法:
  1. 自己的分支回滚直接用reset
  2. 公共分支回滚用revert
  3. 错的太远了直接将代码全部删掉,用正确代码替代
本地分支版本回退:
  1. 先找到要回退的版本的commit id,命令git reflog
  2. 可以根据commit id,查看先前版本的信息,git log <commit id>或者git show <commit id>。退出git log状态,英文状态下按q
  3. 回退版本git reset --hard <commit id>
自己的远程分支版本退回:
如果你的错误提交已经推送到自己的远程分支了,那么就需要回滚远程分支了。
  1. git reflog
  2. git reset --hard <commit id>
  3. 然后强制推送到远程分支,git push -f
  4. 本地分支回滚后,版本将落后远程分支,必须使用强制推送覆盖远程分支,否则无法推送到远程分支

公共远程分支回退:

  回滚公共远程分支和回滚自己的远程分支是有区别的,如果你回退公共远程分支,把别人的提交给丢掉了怎么办?

git fetch 和 git pull 的区别

  1. git fetch <远程主机名> <分支名>
  2. 最常见的命令如取回origin主机master分支
  3. git fetch origin master,从远程主机的master分支拉取最新内容
  4. git merge FETCH_HEAD,将拉取下来的最新内容合并到当前所在的分支中
  5. git pull <远程主机名> <远程分支名>:<本地分支名>
  6. git pull origin master,如果远程分支是与当前分支合并,则冒号后面的部分可以省略
posted @ 2019-01-19 13:20  快乐锁  阅读(2241)  评论(0编辑  收藏  举报