一文记录使用git过程中的坑点

340 阅读7分钟

修改远程URL

git remote set-url origin https://github.com/xxxx/snap.git # 通过HTTP的方式
git remote set-url origin git@github.com:iosmers/snap.git

git config

git config 用于获取并设置存储或者全局变量,这些变量可以控制git的各个操作
git config 分为两个级别

  • 全局级别配置,全局级别配置对应用户目录下的.gitconfig文件
git config --global user.name "your name"
git config --global user.email "you email"
  • 仓库级别,仅仅适用于当前git 仓库,仓库级别配置对应仓库里.git/config文件
git config user.name "your name"
git config user.email "your email"

通过git config 还可以配置git的各种选项,比如文本编辑器、远程仓库地址、钩子等

#[core]部分:这里存储了与git 仓库的核心设置的相关配置
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
#[remote "origin"]部分:这里存储了与远程仓库别名"origin"相关的配置
[remote "origin"]
url = https://github.com/user/repo.git
fetch = +refs/heads/*:refs/remotes/origin/* #fetch表示从远程仓库拉取代码时需要获取的分支
# 可以配置多个origin
[remote "paddle_origin"]
url = https://github.com/user/repo.git
fetch = +refs/heads/*:refs/remotes/origin/* #fetch表示从远程仓库拉取代码时需要获取的分支
#[branch "main"]部分,这里存储了与分支"main"相关的配置
[branch "main"]
remote = origin
merge = refs/heads/main

可以使用git config --list命令列出来git可以在该处找到的所有的设置

git branch 分支管理

# 新建分支并切换到该分支
git checkout -b branch_name
# 将当前分支合并指定分支到当前分支
git merge branch_name
# 删除分支
git branch -d branch_name
# 从本地删除远程分支
git push origin --delete branch_name
git branch -dr remote/branch
查看本地的分支以及关联的分支`git branch -vv`
# 对当前分支进行改名
git branch -m old_branch new_branch

查看分支来源

# 查看分支来源
git reflog show branch_name

对远程分支的操作

#查看所有远程分支
git branch -r
# 查看远程分支及其关联的本地分支
git remote show origin
# 获取远程分支列表
git ls-remote --heads origin

注意,每次都需要从develop分支创建别的分支,不要从还没合并的分支中切过去

git 统计代码行数

*//显示项目的所有文件列表及行数(已删除的文件显示为空),最后一行会显示项目代码的总行数*
git ls-files | xargs wc -l
//只统计项目代码的总行数
git ls-files | xargs cat | wc -l
// 只查看项目文件列表
git ls-files

git rebase 和 git merge

  • git rebase和git merge的作用是一样的,把一个分支合并到另一个分支
  • 不同的是git merge会保留原有分支结构,也正是因为会保留原有分支结构,所以如果git merge用多了就会导致git 分支结构比较庞大
  • rebase操作不会保留分支结构,如果执行git rebase develop命令,它首先会找develop分支和当前分支的公共节点,然后把当前分支嫁接到develop分支上

image.png

image.png

git revert和git reset

git revert和git reset都是用于处理历史提交命令

  • git reset用于将分支的HEAD移动到不同的提交,git reset会修改提交历史,这意味着之前的提交会被抹去,不再存在于分支上。要谨慎使用
git reset --hard commit #这个模式会彻底重置分支,将分支的HEAD移动到指定的提交,并且删除暂存区和工作目录的内容
git reset --soft commit #这个模式将分支的HEAD移动到指定的提交,但是不会更改暂存区和工作目录的内容,之前的修改仍然保留在暂存区和工作目录之中
git reset --mixed commit #
  • git revert用于创建一个新的提交,该提交会首先撤销先前的提交,它不会修改提交历史,而是添加新的提交来取消之前的提交。git revert相对安全。
  • 最大的区别就是一条有记录,一条没记录
  • git revert的目标是保留历史提交,而不是删除或重写提交,使用方法
git revert commitid

拉取别人未合入的PR

# 添加远程链接
git remote add remote_git_repository url
# 拉取远程分支并关联到本地分支
git fetch remote_git_repository remote_branch:local_branch
# 合并代码到本地分支
git merge local_branch

git reflog

git reflog用于记录本地仓库中HEAD(当前分支的顶端)的移动操作。 一般用途:

1、历史记录,git reflog显示了head的变动历史,每次切换分支,创建新提交,重置分支的时候,head的指向都会改变,这些变化都会记录在git reflog中 2、找回丢失的提交,如果你不小心删除了一个分支或者重置了提交,可以使用git reflog找到那些丢失的提交的引用。这是因为即使在删除分支后,git仍然保留了一段时间的操作记录 3、撤销操作,通过查看git reflog,你可以看到之前head的位置,这允许你回退到之前的状态,比如撤销一次错误的rebase,merge或者其他操作 比如:

使用 Git Reflog 找回更改

假设你正在工作于一个项目,并进行了一些更改。在提交这些更改之前,你不小心执行了 git reset --hard HEAD~1,这使得你回到了上一个提交,并丢失了当前的工作。

git reflog

a1b2c3d (HEAD -> master) HEAD@{0}: reset: moving to HEAD~1

e4f5g6h HEAD@{1}: commit: Your recent commit message

...

# 找到之前要恢复到的提交,比如e4f5g6h
git reset --hard e4f5g6h

使用 Git Reflog 撤销合并

假设你正在你的 master 分支上工作,并决定合并一个名为 feature 的分支到 master。但合并后,你意识到这个合并是错误的,你想要撤销它。

git reflog
a1b2c3d (HEAD -> master) HEAD@{0}: merge feature: Merge made by the 'recursive' strategy.
e4f5g6h HEAD@{1}: commit: A commit on master before merge
...
**撤销合并**
git reset --hard e4f5g6h

git stash

git stash命令可以将暂存区和工作区的文件保存到git栈中,一般有两种使用场景

  • 你在dev1下开发分支,突然让你去dev2上修复一个bug,这个时候可以用git stash把你修改暂存起来
# 暂时保存没有提交的工作
$ git stash
Saved working directory and index state WIP on workbranch: 56cd5d4 Revert "update old files"
HEAD is now at 56cd5d4 Revert "update old files"
# 列出所有暂时保存的工作
$ git stash list
stash@{0}: WIP on workbranch: 56cd5d4 Revert "update old files"
stash@{1}: WIP on project1: 1dd87ea commit "fix typos and grammar"

# 恢复某个暂时保存的工作
$ git stash apply stash@{1}

特别注意,使用git stash pop命令,栈里面的记录就没了。另外,pop或者apply命令如果与当前工作区的代码有冲突,需要手动调整。

将多个commit合并到一个commit

在git中,可以使用rebase命令来将多个commit合并成一个commit,这个构成称之为squashing。下面是操作过程
1、启动交互式rebase,这里的N是指想要合并的数量,比如想合并最近的三个提交,N=3,-i是指交互式的rebase

git rebase -i HEAD~N

2、选择要合并的提交,注意看下面的注释的意思,如果想合并提交,除了第一个提交以外,将其余的提交前面pick改为squash或者s,这告诉git将这些提交合并到前一个提交中,第一个通常泡池pick,因为它是其他提交合并的基础

image.png 重新排序提交(如果需要) 4、退出保存,按wq退出,这个过程可能会出现冲突,解决即可 5、编辑最终的提交信息,你可以决定保留哪些信息,或者编写一个新的提交信息 6、强制推送更改

git push --force origin master

git 修改提交信息

假设你刚刚做了一个提交,但突然发现提交信息有错误或者需要补充内容,这时可以使用git commit --amend来修改提交信息,此时git会将新的更新与上一次提交合并为一个新的提交,而不会创建新的提交记录.假如你不想修改提交的commit信息,可以直接使用git commit --amend --no-edit 命令来提交。