git 笔记

159 阅读8分钟

本地仓库

初始化 一个Git仓库,使用 git init 命令。

添加文件到Git仓库,分两步:

  1. 使用命令git add <file>,注意,可反复多次使用,添加多个文件;
  2. 使用命令git commit -m <message>,完成。

状态

  • 要随时掌握工作区的状态,使用git status命令。
  • 如果git status告诉你有文件被修改过,用git diff可以查看修改内容。

版本
HEAD 指向的版本就是当前版本;上一个版本就是 HEAD^;上上一个版本是 HEAD^^;当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

提交历史

  • git log 可以查看提交历史,以便回退到哪个版本;其中c31f7042a0e...1bb72340af... 是 SHA1 计算出来的一个非常大的数字,用十六进制表示,表示 commit id 信息。

image.png

  • git log --pretty=oneline 版本信息在一行显示

image.png

命令历史
git reflog 查看命令历史

回退版本 git reset --hard XXX

回退到上一个版本:git reset --hard HEAD^

回退到某个版本 commit id 是 1bb723 git reset --hard 1bb723

PS: 版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了

工作区和暂存区
Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

image.png
git add 会将修改文件提交到暂存区(stage) 中;
git commit 会将暂存区的内容提交到当前分支 master 上。

撤销修改

  1. 没有提交到暂存区(stage)时撤销修改:
  • git checkout -- <file>
  • git restore <file> 两个命令等价;不能撤销没有提交过的 untracked 文件的新增
  1. 从暂存区(stage)撤销修改:
  • git reset HEAD <file>
  • git restore --staged <file> 两个命令等价;从暂存区(stage)撤销修改后,再执行步骤1即可回退到文件最开始状态。

删除文件
git rm <file> 会起到两个作用:

  • 删除本地文件
  • 同时同步到暂存区
  1. 同意删除文件,使用 git commit 提交到本地仓库。
  2. 不同意删除文件,使用上面的 撤销修改 进行回退。

image.png

远程仓库

  1. 新建远程仓库
    github 网页端 create repository:

wecom-temp-1fe6d20f1aed4ea1366c090da7f0c43b.jpg

  1. 建立本地分支与远程分支的关联
git remote add origin git@github.com:YY88Xu/gitskill.git

将本地代码提交到远程:

git push -u origin master

由于远程库是空的,我们第一次推送 master 分支时,加上了-u参数,Git不但会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,在以后的推送或者拉取时就可以简化命令。

wecom-temp-20600457335841718f62421b1ef104c0.jpg 其中,git branch -M main 可以将本地分支重命名为 main

分支管理

创建与合并分支

Git 鼓励大量使用分支:

查看本地仓库分支:git branch

创建本地仓库分支:git branch <name>

切换本地仓库分支:git checkout <name>或者git switch <name>

创建+切换本地仓库分支:git checkout -b <name>或者git switch -c <name>

合并某分支到当前本地仓库分支:git merge <name>

删除本地仓库分支:git branch -d <name>

注意上面的命令都是针对 本地仓库 的操作。

解决冲突

确切的说应该是解决本地分支合并冲突:master 分支和 feature1 分支对同一文件做了修改(且已经 git commit 仓库中),如果想把 feature1 分支合并到 master 分支的时候,有可能产生冲突:

image.png

通过 git status 命令查看状况:

image.png 包括两种解决方案:

  1. 继续合并:手动解决冲突,然后 git add readme.txtgit commit 到仓库中;
  2. 选择回退,不合并 feature1 分支,使用:git merge --abort

在实际工作中出现冲突的情况是比较常见的,比如你和另外一个同事同时编辑了同一个文件,但是你的同事先于你先 push 到远程分支,当你准备 push 的时候会报下面的错:

wecom-temp-899c872bf1930725cea9e5b0b1a02777.jpg 当你满心欢喜 git pull 的时候,会发现有冲突: wecom-temp-793e4eb7c2a213c449be8336fb54aefb.jpg

同样的解决方案有上面两种,通常我们都是会选择手动解决冲突,然后 git add readme.txtgit commit 到仓库中,git push 到远程仓库中。

wecom-temp-0267f53948e5efac444d689d44e29943.jpg

合并策略

做合并操作的时候有 3 种模式可以选择:

image.png 更多细节:www.cnblogs.com/damoblog/p/…

笔者对 fast-forward--no-ff 两种模式进行了详细对比,主分支是 mainfeature-mergefeature-no 分别用于测试 fast-forward--no-ff 两种模式:

  1. feature-merge 分支合并到 main 上,以及将 feature-no 分支合并到 main 上:
git merge feature-merge
git merge --no-ff -m "maerge with no ff" feature-no  // 拼写多了个 a 😂

对比显示可以看出,--no-ff 会多出一次 merge 的提交信息。--no--ff 模式其实就是相当于main 指针 new 了一个跟 feature-merge 指针一样的空间并且放了相同的内容然后指向这个空间。而原来的快速模式 fast-forward,就是简单将 main 指针指向feature-merge指针指向的内容而已,并没有自己创造空间。

  1. 回退上一版本测试。使用 git reset --hard HEAD^ 命令回退到合并之前的状态:

因为 fast-forward 模式下,feature-merge 的提交记录被混在了 main 分支上,所以回退到上一版本会回退到 merge1 的版本下;而 --no--ff 模式则会真正回退到合并前的版本 187552a 版本,不会让合并和回退变得混乱。这也就是很多人都会推荐 –no-ff 的原因。

bug 分支

当手头工作没有完成时,先把工作现场 git stash 一下,然后去新建分支修复 bug,修复后,再git stash pop,回到工作现场;

在 master 分支上修复的 bug,想要合并到当前 dev 分支,可以用 git cherry-pick <commit>命令,把 bug 提交的修改“复制”到当前分支,避免重复劳动。

强行删除

如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

多人协作

因此,多人协作的工作模式通常是这样:

  1. 首先,可以试图用git push origin <branch-name>推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>

这就是多人协作的工作模式,一旦熟悉了,就非常简单。

小结

  • 查看远程库信息,使用git remote -v
  • 本地新建的分支如果不推送到远程,对其他人就是不可见的;
  • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
  • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

rebase

git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase

标签管理

创建本地标签

  • 命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
  • 命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
  • 命令git tag可以查看所有标签。

操作标签

  • 命令git push origin <tagname>可以推送一个本地标签;
  • 命令git push origin --tags可以推送全部未推送过的本地标签;
  • 命令git tag -d <tagname>可以删除一个本地标签;
  • 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

常用指令

查询分支

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

新建分支

假设新建的分支名称为「AAA」

  • 新建本地分支 git checkout -b AAA
  • 将新建的分支推送到远程 git push -u origin AAA
  • 其它终端从远程检出分支「AAA」到本地 git checkout -b origin/AAA
  • 建立本地分支与远程分支的链接 git branch --set-upstream-to=origin/dev dev 其中,git push -u origin AAA 相当于执行 git push origin AAA 和 git branch --set-upstream-to=origin/AAA AAA

删除分支

假设要删除的分支名称为「AAA」

  • 删除本地分支 git branch -d AAA
  • 删除远程分支方法一 git push origin :AAA
  • 删除远程分支方法二 git push origin --delete AAA

修改分支名称

假设要将分支「AAA」修改为分支「BBB」

  1. 修改本地分支名 git branch -m AAA BBB
  2. 删除远程「AAA」分支 git push origin :AAA
  3. 将「BBB」推到远程 git push --set-upstream origin BBB

查看日志

  • 一行显示:git log --graph --pretty=oneline --abbrev-commit 命令历史
    git reflog 查看命令历史

回退版本 git reset --hard XXX

回退到上一个版本:git reset --hard HEAD^

回退到某个版本 commit id 是 1bb723 git reset --hard 1bb723

强制推送到远程分支: 本地回退完后,远程如果也需要回退的话。需要推送到远程:git push -f origin master ## 这里假设只有一个 master 分支

image.png

临时隐藏代码修改
隐藏: git stash
显示:git stash pop

# git branch用法总结,查看、新建、删除、重命名
# git新建、修改、删除分支的一些常用命令
# Git教程
Git笔记:git取消Commit,取消add,回滚代码_commit add rollback-CSDN博客