git使用记录

547 阅读11分钟

常用命令

基本配置

使用 --global 选项之后无论你在该系统上做任何事情,Git 都会使用该配置信息。如果想针对特定项目使用不同的用户名称与邮箱地址时,可以在对应项目目录下不使用 --global 选项的命令来配置。

  • git config --global user.name "" git config --global user.email "" 配置后可以使用该命令进行切换
  • git config --list 查看配置信息
  • git config user.name git config user.email 查看信息

创建版本库

  • 自己创版本库 git init
  • clone版本库 git clone '仓库地址'

查看版本库修改状态

  • git status 查看文件层面的修改
  • git diff 查看详细修改信息
  • git diff --cached, git diff --staged 查看已经暂存的改动

添加修改到暂存区

  • git add . 添加所有的修改
  • git add filename 添加指定的文件

提交修改信息

  • git commit -m "commit info"
  • git commit -a -m "commit info" 省去add步骤,直接提交,如果有新增文件必须add

将本地提交推到远程库

  • git push -u origin 本地分支:远程分支。 两个分支相同写一个即可; 第一次提交有-u参数 ,后续提交git push 即可。
  • 强推的时候后面加 -f 参数,一般用于版本回退之后的push,需谨慎使用。

拉取远程分支

  • git pull origin 远程分支:本地分支。 两个分支相同写一个即可; 如果当前分支与远程分支存在追踪关系可以省略分支名; 如果当前分支只有一个追踪分支则可以省略远程主机名 origin。

合并本地分支

  • git merge branchA 合并分支branchA到当前分支
  • git merge --abort 恢复到合并前的状态

切换分支

  • 切换一个新分支 git checkout -b 新分支
  • 切到一个新分支并与线上的对应分支同步(保证本地的版本库有线上新分支的相关信息) git checkout -b 新分支 origin/新分支 或 git checkout 新分支

查看分支相关信息

  • git branch 查看本地分支
  • git branch -a 列出所有本地分支和远程分支
  • git branch -r 列出所有远程分支

删除分支

  • git branch -D branchname 删除本地分支
  • git push origin --delete branchname 删除远程分支

比较两个分支的差异

  • git log branchA..branchB 比较两个分支的提交次数的差异 ..后面即branchB比branchA多提交的内容
  • git diff branchA branchB 比较两个分支的具体不同
  • git diff master origin/master 远程分支与本地分支比较
  • git diff branchA branchB --stat 对比两个分支文件层面的差异

查看提交历史

  • git log。 -p参数显示每次提交的差异; 可以加-2参数显示最近两次的提交。

查看提交历史的详细信息

  • git show commitId 查看某一次提交的详细信息
  • git show commitId --stat 查看某一次提交文件层面的信息

撤销提交

  • git revert commitId 撤销指定的提交
  • git revert commitId1..commitId2 撤销一串提交,前开后闭不包括1包括2

本地库与远程库建立连接

  • git remote add origin 远程仓库地址。origin为远程仓库的简写,一般默认使用origin

cherry-pick

需要将某一个分支的单个提交或者多个提交合并到指定分支

  • 合并指定提交
// 获取指定提交的hash
git log
// 切换到要合并此提交的分支
git checkout
// 合并此提交
git cherry-pick commit_hash
  • 合并某个分支的最后一次提交
git cherry-pick branch_name
  • 合并多个指定提交
git cherry-pick commit_hash1 commit_hash2
  • 合并多个连续提交

提交1必须早于提交2

// 提交1将不会包含在Cherry pick中
git cherry-pick commit_hash1..commit_hash2

// 提交1将会包含在Cherry pick中
git cherry-pick commit_hash1 ..commit_hash2

tag

  • 添加本地tag
git tag -a v0.0.2 -m "v0.0.2"
  • 添加远程tag
git push origin v0.0.2
  • 删除本地tag
git tag -d v0.0.2
  • 删除远程tag
git push origin --delete v0.0.2
  • 给指定的提交添加tag
git tag -a v0.0.2 commit-hash -m "v0.0.2"

合并代码的冲突解决

  • 完全使用自己当前的修改(ours)
git checkout --ours filePath(某一文件路径)
  • 完全使用远端的修改(theirs)
git checkout --theirs filePath(某一文件路径)

撤销某一次提交 revert

git revert 撤销某次commit,此次操作会作为一次新的commit 提交,同时不会影响之前的commit记录

git revert HEAD                撤销前一次 commit
git revert HEAD^               撤销前前一次 commit
git revert commit_hash           撤销指定的版本

临时保存当前的修改

  • git stash 即可将在当前分支修改的内容隐藏(不会隐藏新添加的文件)
  • git stash list 查看隐藏的记录
  • git stash pop stash@(0)恢复某一条隐藏记录(无最后隐藏记录标识时默认恢复最近的一条隐藏记录)同时会删除这条记录
  • git stash apply stash@(0)恢复某一条隐藏记录(无最后隐藏记录标识时默认恢复最近的一条隐藏记录)但不会删除这条记录

修改上一次commit的信息

  • git commit --amend --no-edit(--no-edit 表示上次提交信息不会更改) 将新的提交加到上一次的提交中。使用 git push -f 强推即可。
  • git commit --amend -m "new commit message" 更改上次的提交信息
  • git commit --amend --author "name <email>" 更改上次提交的作者消息
  • 修改上次提交时间
date -R // 获取时间格式
Sat, 24 Dec 2016 18:12:09 +0800 // 时间格式
git commit --amend --date='new_date'  修改上次提交时间

git撤销修改

文件重命名在git中的体现为删除原命名文件,添加新命名文件。

没有add的修改

对于没有add的修改,可以使用git checkout -- .命令撤销所有未add的修改,撤销某个文件修改git checkout -- filename。并可以恢复删除的文件,但是不能删除新增的文件,想要去除新增的文件使用git clean -df命令,使用git clean -df和git checkout -- .两个命令可以去除所有未add的修改。

已经add的修改

使用git reset --hard撤销已经add的修改,并可以恢复删除的文件,同时也可以去除新增的文件。如果只想撤销某个文件已经add的修改 git reset HEAD filename

已经commit的修改

使用git reset --hard commit_id(提交历史的id),回退到对应commit_id的版本。退回到历史版本使用git log命令获取commit_id, 对于退回到高于现在版本的某一个版本使用git reflog命令获取commit_id。

git checkout -- .

没有add的时候使用才有效,会撤销所有未add的修改,并可以恢复删除的文件,但是不能删除新增的文件。

git clean -df

没有add的时候使用才有效,用于去除新添加的文件。

git reset --hard

没有add的时候使用会撤销所有的修改,并恢复删除的文件,但新增文件无法去除;在已经add的时候使用会撤销所有的修改并恢复删除的文件,同时会删除新增加的文件。

rebase

当从a分支切到b分支的时候在b分支中做了多次提交,而且a分支在切到b分支之后也做了多次提交,想要在b分支将a分支的提交按顺序走完才有b分支的提交要使用到rebase变基。

git checkout b
git rebase a
// 执行上述的指令之后会将a分支的提交逐个按顺序添加到b分支,如果有冲突必须手动解决冲突,解决完之后执行以下命令,没有冲突,会自动执行完毕
git add fixedfile
git rebase --continue
  • 退出 rebase
git rebase --abort

git fetch

git fetch相当于从远程获取最新到本地,不会自动merge。

git fetch origin master 将远程的master分支下载到本地
git merge origin/master 将远程的master分支进行合并

git fetch origin master:mastercopy 获取最新远程的master分支并在本地建立mastercopy分支
git merge mastercopy 将mastercopy分支合并到当前分支

// 使用pull代替
git pull origin master

删除某一次提交

  1. 找到此提交前的commit-hash
  2. git rebase -i commit-hash
  3. 进入编辑模式,将想要删除的提交前面改为 drop
  4. 保存并退出编辑模式

git 输入模式

  1. 进入编辑模式 按键 i
  2. 按住 ESC 键,并且同时快速按大写的Z键两次,可以保存好并退出编辑器
  3. :q! 退出编辑器

.gitignore的使用

创建项目时就创建该文件,每一行就是一个忽略规则。

忽略规则

  • *.log 表示忽略所有.log文件
  • !a.log 表示不忽略a.log文件
  • a/*.log 表示忽略a目录下的.log文件,但是a目录下的子目录下的.log文件不忽略
  • a/**/*.log 表示忽略a目录下所有的.log文件
  • /a.log 表示忽略根目录小的a.log文件
  • a/: 表示忽略a 目录下所有内容

如果对.gitignore文件进行修改

  • git rm -r --cached . // 删除缓存
  • git add .
  • git commit -m '更新.gitignore文件' // 重新提交文件到仓库

自己fork的库与原仓库同步

  1. git remote -v (本地仓库的远程信息)
  2. git remote add upstream 原仓库地址 (upstream可以是任意名字)
  3. git fetch upstream (获取原仓库的更新到本地)
  4. git merge upstream/master (将upstream/master的更新合并到本地master分支,可以merge任何分支)

git提交前缀信息规范

对于关闭issue的代码改动,commit时每一条记录对应一个issue,commit信息用来描述相关issue信息,有助于溯源。

  • feat:新功能
  • fix:修补 BUG
  • docs:修改文档,比如 README, CHANGELOG, CONTRIBUTE 等等
  • style:不改变代码逻辑 (仅仅修改了空格、格式缩进、逗号等等)
  • refactor:重构(既不修复错误也不添加功能)
  • perf:优化相关,比如提升性能、体验
  • test:增加测试,包括单元测试、集成测试等
  • build:构建系统或外部依赖项的更改
  • ci:自动化流程配置或脚本修改
  • chore:非 src 和 test 的修改,发布版本等
  • revert:恢复先前的提交

自定义git命令缩写

  • git config --global alias.st status。st就表示status

git commit时的eslint检验

  • git commit -m "commit infos" --no-verify。 去除校验使用--no-verify后缀

git换行符

Windows换行使用CRLF,Mac和Linux使用LF

  • 文件包含混合换行符时是否可以提交
#拒绝提交包含混合换行符的文件
git config --global core.safecrlf true   

#允许提交包含混合换行符的文件
git config --global core.safecrlf false   

#提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn
  • 是否转换换行符
#提交时转换为LF,检出时根据当前系统决定转换为CRLF或者不转换
git config --global core.autocrlf true   

#提交时转换为LF,检出时不转换
git config --global core.autocrlf input   

#提交检出均不转换
git config --global core.autocrlf false
  • 建议设置
#提交时转换为LF,检出时根据当前系统决定转换为CRLF或者不转换
git config --global core.autocrlf true

#拒绝提交包含混合换行符的文件
git config --global core.safecrlf true 

git使用中常见问题

修改文件名字(git忽略文件的大小写问题)大小写造成的文件跟踪问题

文件重命名之后可能造成文件追踪的问题导致线上仓库与本地仓库文件的不一致,在本地将问题文件移除然后push到线上仓库,再将问题文件还原回来重新push到线上仓库即可。

修改电脑密码之后pull以及push代码显示没有权限

使用git config --system --unset credential.helper 此命令之后会提示输入框,但是每一次操作都会提示。再使用 git config --global credential.helper store 此命令之后只需再输入一次即可。

git报错bad signature和index file corrupt

说明.git/index 这个文件已经损坏了需要删除这个文件并新建一个

  1. rm -f .git/index
  2. git read-tree

git命令行工具意外退出导致merge以及pull代码时的警告问题

Swap file .MERGE_MSG.swp already exists的警告,.swp 文件和 git 无关,在使用 VIM 开始编辑某文件时,都会产生该文件对应的 .swp 文件。正常的退出,VIM 会自动删除此类型文件,非正常退出情况下, VIM 不会删除 ,.swp 文件会作为文件编辑状态的内容备份。

  1. git merge -abort 中止合并,回到合并前的状态
  2. rm .git/.MERGE_MSG.sw* 删除 vim 非正常关闭产生的文件
  3. git merge 重新合并 git clone时出现Failed to connect to github.com port 443: Timed out

将克隆地址的https改成git

github ping不通

在host文件添加对应映射,在https://www.ipaddress.com/中查询下列域名的ip即可。

140.82.112.3 github.com
199.232.5.194 github.global.ssl.fastly.net
54.231.114.219 github-cloud.s3.amazonaws.com

github pull或push报错OpenSSL SSL_read: Connection was reset, errno 10054

执行下面两个命令后再尝试。

git config --global http.sslVerify "false"
git config --global https.sslVerify "false"