Git

摩森特沃 2021年03月29日 464次浏览

git是什么

  • Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目

git常用命令

配置命令

查看配置

  • 查看用户名:git config user.name
  • 查看邮箱:git config user.email

基础配置

  • 配置用户名:git config --global user.name "yourusername"
  • 配置邮箱:git config --global user.email "youruseremail"
  • 其他配置(让Git忽略Windows/Unix换行符转换):git config --global core.autocrlf false

修改基础配置

  • 命令行方式修改
  • 修改用户名:git config --global --replace-all user.name "your user name"
  • 修改邮箱:git config --global --replace-all user.email"your user email"
  • 修改文件的方式修改

修改文件的方式,主要是修改位于主目录下.gitconfig 文件,可以直接使用记事本修改里边的name 或者email

  • 在Linux和Mac中,可以通过vim命令进行直接编辑,比如vim ~/.gitconfig
  • Windows系统同样位于用户主目录下,假设当前的用户是administrator,那么对应的配置文件的路径为:C:\Users\administrator.gitconfig

编码配置

  • 避免git gui中的中文乱码:git config --global gui.encoding utf-8
  • 避免git status显示的中文文件名乱码:git config --global core.quotepath off

git ssh key pair配置

  • 作用:方便免密码拉取以及发布版本
  • 步骤
    • sh-keygen -t rsa -C "youremaiaddress" 一路回车生成ssh key pair
    • ssh -add ~/.ssh/id_rsa
    • cat ~/.ssh/id_rsa.pub

常用操作命令

仓库地址相关命令

  • 查看远程仓库地址:git remote -v
  • 增加远程仓库:git remote add github 远程仓库地址

github为远程仓库的名字,当本地仓库绑定了多个远程仓库时,在提交代码时注意以下命令的区别:

  • 推送到origin(默认)仓库:git push
  • 修改默认的仓库:git push -u 远程仓库名称
  • 修改远程仓库地址:git remote set-url origin 远程仓库地址
  • 添加远程仓库地址:git remote set-url --add origin 远程仓库地址
  • 向多个地址推送代码:git push

代码管理常用命令

  • 克隆代码:git clone 版本库地址 [本地文件夹名称]
  • git初始化项目:git init
  • 查看文件状态:git status
  • 添加文件到暂存区:git add file
  • 提交到本地库:git commit -am 说明,a表示提交全部
  • 拉取和提交文件:git pull/push
  • 显示暂存区和工作区的差异:git diff
  • 恢复文件到某个版本:git reset --hard 版本号
  • 查看某次提交记录提交的文件列表:git log --name-status commitId

分支管理常用命令

  • 列出所有本地分支:git branch
  • 列出所有远程分支:git branch -r
  • 列出所有本地和远程分支:git branch -a
  • 创建分支:git branch 分支名称
  • 切换分支:git checkout 分支名称
  • 创建并切换到分支:git checkout -b 分支名
  • 合并到当前分支:git merge 需要合并的分支名
  • 合并到当前分支:git rebase 需要合并的分支名
  • 合并部分提交内容到当前分支:git cherry-pick commitID
  • 删除本地方分支:git branch -d 分支名称
  • 强制删除本地分支:git branch -D 分支名称
  • 删除远程分支:git push origin --delete 分支名称

暂存区管理常用命令

当当前分支有代码修改,但不能提交,此时需要切换到另外的分支,如果直接切换,会提示未提交不能切换,此时需要使用暂存区的相关命令进行处理

  • 暂存当前工作区的改动到git栈:git stash [save message]

save为可选项,message为本次保存的注释

  • 查看暂存区git栈中的列表:git stash list
  • 弹出暂存区git栈中的改动:git stash pop stash@{num}
  • 使用该命令会删除栈中对应的stash;
  • 直接使用git stash pop可以弹出最近一次的改动
  • stash@{num}中的num可以在使用git stash list命令后看到
  • 弹出暂存区git栈中的改动:git stash apply stash@{num}
  • 删除暂存区git栈中的改动:git stash drop stash@{num}
  • 删除所有暂存区git栈中的改动:git stash clear

其他高频操作和命令

忽略指定文件或目录

  • 在.gitignore添加忽略文件
  • 使用命令检查.gitignore文件是否配置有效,检查命令为:git check-ignore -v 文件名

如果文件已经被忽略了,此时需要提交可使用强制提交的方式:git add -f 文件名

按照最新的.gitignore配置忽略文件

  • git rm -r --cached .
  • git add .
  • git commit -m ‘update .gitignore’

去掉已经托管的文件

  • 有时候发现有不该提交的文件已经提交后,仅仅在.gitignore中加入忽略是不行的。这时候需要执行命令来去掉已经托管的文件,去掉文件后直接提交即可,相关命令如下:
  • git rm -r --cached 文件/文件夹名字:取消对指定文件/文件夹的跟踪,但保留本地文件(较常用)
  • git rm -r --f 文件/文件夹名字:取消对指定文件/文件夹的跟踪并删除本地文件

取消代码合并

  • git merge --abort

代码覆盖

本地代码覆盖远程代码

  1. git push -f

注意:该命令需要权限,权限默认为允许

远程代码覆盖本地代码

  1. git fetch
  2. git reset --hard origin/远程分支名称

解决冲突

git merge和git pull命令导致的冲突

  • 手动处理完冲突后git commit -a

git rebase命令导致的冲突

  • 手动处理完冲突后使用git rebase --continue或者git rebase --skip

git stash apply命令导致的冲突

  • 手动处理完冲突后使用git add .

代码撤销

撤销工作区中文件的修改

  • git checkout -- <file>
  • 文件自修改后还没有被放入到暂存区,撤销修改则会回到版本库中的状态
  • 文件已经添加到暂存区后又做了修改,撤销修改则只会回到暂存区中的状态

撤销最近一次的提交

  • git reset HEAD^

在HEAD前支持以下参数

  • --soft:不删除工作空间的改动代码 ,撤销commit,不撤销git add file
  • --hard:删除工作空间的改动代码,撤销commit且撤销add

回滚到指定的版本

  • 方式一:git reset commitID

注意:

  • 使用此方式会将提交记录一并撤销,因此在使用git push命令时,会导致提交被拒绝,必须时启用强制提交的命令:git push -f
  • 强制提交时,可能会遇到不允许强制提交的情况,因此推荐使用第二种方式来回滚代码
  • 方式二:git revert commitID

使用此方式代码版本记录不会被撤销,而是产生新的代码版本

  • 使用以上两种方式回滚代码后,本地代码并不会改变,此时需要使用git checkout 文件名来修改本地的文件

单个文件回滚到指定版本

  • 查看文件所有的修改记录:git log fileName
  • 回退到指定版本:git reset 版本号 fileName
  • 提交到本地:git commit -m "提交的描述信息"
  • 更新到工作目录:git checkout fileName
  • 提交到远程仓库git push origin master

代码恢复

找回被删除的分支

找回分支的前提是没有执行git gc命令清除分支

一般情况下,除非手动执行了git gc命令,否则gc对那些无用的object会保留很长时间后才清除的,reflog是Git提供的一个内部工具,用于记录对Git仓库进行的各种操作,可以使用git reflog show所有的管理类操作日志

git log与git reflog的区别:git log命令可以显示所有提交过的版本信息,但我们对分支的一些管理操作并不会显示出来;这些管理的操作日志并不是没有记录,而是需要使用git reflog命令才能显示

找回步骤

  1. 找出commitID:git reflog show
  2. 新建已删除的分支
    • git checkout -b 新建的分支名称 commitID
    • git checkout 分支名称 commitID

找回回滚前的代码

  1. 找出回滚前的commitID:git reflog show
  2. 恢复:git reset --hard commitID

从历史版本中找回删除的文件

  1. 找出要恢复的commitID:git reflog show
  2. 恢复:git checkou commitID 文件路径

修改commit描述

  • git commit --amend

运行该命令会进入vim编辑器,修改注释后保存即可

转移commit进行提交

处理流程

  1. git checkout -b branchName [remotes/origin/branchName]:新建一个分支
  2. git cherry-pick commitId:挑选需要提交的commit
  3. git push origin branchName:提交到指定远程分支

内容扩展

  • git cherry-pick <commitHash>:将指定提交转移到当前分支
  • git cherry-pick branchName:将branchName分支的最近一次提交转移到当前分支
  • git cherry-pick <HashA> <HashB>:将多个提交转移到当前分支
  • git cherry-pick A…B:将A到B的所有提交转移到当前分支(不包含A)
  • git cherry-pick A^…B:将A到B的所有提交转移到当前分支(包含A)
  • cherry-pick配置项
  • -e,–edit:打开外部编辑器,编辑提交信息
  • -n,–no-commit:只更新工作区和暂存区,不产生新的提交
  • -x:在提交信息的末尾追加一行(cherry picked from commit …),方便以后查到这个提交是如何产生的
  • -s,–signoff:在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作
  • -m parent-number,–mainline parent-number:如果原始提交是一个合并节点,来自于两个分支的合并,那么 Cherry pick 默认将失败,因为它不知道应该采用哪个分支的代码变动,-m配置项告诉 Git,应该采用哪个分支的变动。它的参数parent-number是一个从1开始的整数,代表原始提交的父分支编号
    • 常用命令:git cherry-pick -m 1 <commitHash>,表示Cherry pick采用提交commitHash来自编号1的父分支的变动,一般来说,1号父分支是接受变动的分支(the branch being merged into),2号父分支是作为变动来源的分支(the branch being merged from)

常见问题处理

执行ssh-add时出现Could not open a connection to your authentication agen

  1. 先执行eval ssh-agent
  2. 执行ssh-add ~/.ssh/rsa
  3. 再使用ssh-add -l查看就有新加的rsa了

推送本地克隆项目的更新内容

  1. 增加文件至本地仓库:git add .
  2. 提交文件到本地仓库:git commit -am 提交描述
  3. 推送:git push

将本地已有文件夹和文件推送到远程服务器处理流程

  1. 初始化本地的项目文件:git init
  2. 绑定远程仓库地址:git remote add origin 远程仓库地址
  3. 增加文件至本地仓库:git add .
  4. 提交文件到本地仓库:git commit -am 提交描述
  5. 拉取远程代码:git pull origin master
  6. 提交到分支(第一次提交):git push --set-upstream origin 分支名称

将本地已有仓库推送到线上仓库(空白仓库)

  1. 绑定远程仓库地址:git remote add origin 远程仓库地址
  2. 提交代码到远程仓库:git push -u origin master

-u选项会指定一个默认主机

本地仓库与远程仓库建立关联

  1. git remote add origin 地址

修改与本地仓库连接的远程仓库地址

  1. git remote set-url origin 新远程仓库地址

git pull 失败

  • 错误提示为:fatal: refusing to merge unrelated histories
  • 处理方式:git pull origin master --allow-unrelated-histories

idea terminal使用git log命令无法显示中文

  • 修改终端设置
  1. 路径为:Settings -> Terminal -> Project settings
  2. 在Environment Variables中增加`LESSCHARSET=utf-8`