Coder Social home page Coder Social logo

git-notes's Introduction

Git_Notes

Solution for problems appeared during using Git

仅用于记录使用Git指令时遇到的一些问题及其解决方案, 以便后续遇到同样问题时查看...


🔗 查看跳转 👉 Issues

git-notes's People

Contributors

douc1998 avatar

Stargazers

 avatar

Watchers

 avatar  avatar

git-notes's Issues

git 入门(三)

git 入门(三)

分支创建 / 管理 / 删除等操作:

  • git checkout -b <new_branch> 创建并切换分支。
  • git branch <branch> 新建分支。
  • git checkout <branch> 切换分支。
  • git merge <branch> 合并分支到当前分支。
  • git branch 查看本地分支。
  • git branch -a 查看本地和远程所有分支。
  • git branch -r 查看远程所有分支。
  • git branch -d <branch> 删除分支。

场景
在进行多分支开发时,比如你在 A 分支上开发,但是突然发现 B 分支上有个 bug 需要修复。我们可以把 A 分支上开发一半的功能本地 commit,然后切换到 B 分支修复 bug,然后再切回 A 分支继续开发。但是这种做法会存在一个问题:log 上会有大量不必要的记录。

现在可以使用 git stash 将你当前未提交到本地(和服务器)的代码推入到 Git 的栈中,放心切换到 B 分支修复代码,解决后切换回 A 分支使用 git stash apply 将以前一半的工作应用回来。

  • git stash 暂存修改内容到 git 栈中。
  • git stash save <message> 暂存修改内容到 git 栈中,并添加说明信息。
  • git stash list git 栈中的暂存内容列表。
  • git stash apply 取出 git 栈中最近的一次存储内容,取出后 git stash list 中仍会有该内容的记录。
  • git stash apply stash@{x} 取出 git 栈中编号为 x 的存储内容。
  • git stash pop 取出 git 栈中最近的一次存储内容,并且 git stash list 中不存在该内容的记录。
  • git stash clear 清空 git 栈中所有缓存内容。
  • git stash clear stash@{x} 移除指定的 stash 缓存内容。

删除上一次commit内容(没push)

✅ 删除上一次commit内容(没push)


在写项目的时候, 在git add . => git commit -m 'xxx' 之后, 但是还没push. 我突然想 取消这次 commit, 该怎么办呢?

如果你还没有推到远程, 把Git重置 (reset) 到你最后一次提交前的状态就可以了:

$ git reset --soft HEAD@{1}

当然, 使用 reset指令后, 同时会保存暂存的变化, 不用担心之前修改的代码丢失 !


参考文章:
🔗 45 个 Git 经典操作场景,专治不会合代码

git 入门(四)

git 入门(四)

合并分支、解决冲突等操作:

情景:当 A 在主分支上修改了某个文件 test.txt 中的第一行文字,此时 B 也在分支上 branchB 修改了该文件的第一行文字,如果 B 使用 git merge master 指令合并分支,那自然会发生冲突

解决方法:
当出现冲突后,文件中会出现下面的冲突内容:

截屏2023-04-03 15 39 13

其中 >>>=== 中间的内容是 A 在 master 分支上修改的内容,===<<< 之间的内容是 B 在 branchB 分支上修改的内容。当出现问题之后,我们需要手动修改冲突,如下:

截屏2023-04-03 15 43 12

我们需要删除提示信息,并且把对应的冲突内容和另一名开发成员协商(假设是都保留),那么就留下最后两行内容即可。之后使用 addcommitpush 等一系列操作进行推送。

git rebase 和 git merge

除了使用 git merge 合并分支,我们也可使用 git rebase 合并分支。假设现在存在两个分支 masterfeature,它们都各自进行了若干版本的更新,此时需要把 master 分支合并到 feature 上。我们知道可以使用以下指令:

git checkout feature
git merge master

git merge 合并分支会在 feature 分支中创建一个新的 merge commit,它将两个分支的历史联系在一起,请看如下所示的分支结构:

image

由上图可知,整个 git 版本提交和流程不再是线性,而是先分叉为二叉树,再合并。此外,也多了一次 merge commit 的提交操作,这也意味着可能会污染你的 feature 分支历史记录。


如果使用 git rebase 就可以解决这种非线性操作的问题。git rebase 将整个 feature 分支移动到 master 分支的顶端,从而有效地整合了所有 master 分支上的提交。但是,与 merge 提交方式不同,rebase 通过为原始分支中的每个提交创建全新的 commits 来重写项目历史记录。

执行流程如下:

git checkout feature
git rebase master

image

rebase 的优点在于可以获得更清晰的项目历史,不存在额外的提交内容,并且可以产生线性的历史记录,你可以在 feature分支上没有任何分叉的情况下一直追寻到项目的初始提交。


此外,如果没有采用分支开发,而是大家都在同一个分支上开发时,我们在 git push 之前是需要 git pull 的,但是如果别人修改了文件(但是没有产生冲突),我们在 push 之前使用 pull,也会造成一次 merge 的额外提交。因此,我们也可以在 git pull 后加上 --rebase 从而避免这种提交。

git pull --rebase

参考

git 入门(二)

git 入门(二)

撤销、删除等操作:

  • git checkout --<file> 撤销工作区某个文档的修改。
  • git checkout . 撤销工作区修改。
  • git reset HEAD <file> 将暂存区的某个文件撤回到工作区。
  • git reset . 撤销暂存区所有内容。
  • git reset [--soft | --mixed| --hard] HEAD^ 撤回上一次 commit 提交。
  • git reset [--soft | --mixed | --hard] commitId 撤回 commitId 的 commit 提交,可以通过 git log 查看 commitId

soft 表示撤销提交,并把内容移回到暂存区;mixed 表示撤销提交,保留修改内容到工作区;hard 表示撤销提交,直接丢弃修改,回退到某一版本。默认为 mixed

  • git rm <file> 删除已提交的文件。
  • git clean -d 删除未跟踪的文件和目录。
  • git clean -f 强制删除未跟踪的文件。
  • git clean -fd 强制删除未跟踪的文件和目录。

git commit --amend 修改提交

✅ git commit --amend 修改提交

我们经常会出现一些情况, 比如 git commit -m 'update xxx file'之后突然发现...

  • -m '...' 中的描述内容写错了
  • 更严重的是 git add . 时并没有保存一些刚刚修改的内容.

这个时候 git commit --amend 就派上用场了 ! ! !


  • 场景一:

描述内容写错, 举例:

git add .
git commit -m 'I am ugly' // description 内容写错了

 --- 解决方案 ---
git commit --amend -m 'I am cool'

'I am cool' 将会覆盖 'I am ugly'的提交.

我们通过 git log 查看时会发现, 之前提交的 'I am ugly' 没了, 只有 'I am cool' .


  • 场景二:

add前修改没有保存 或 add后需要修改文件.

git add .
git commit -m 'update readme'

 --- 解决方案 ---
git add . // 保存修改后或新的内容
git commit --amend -m 'update xxx' // 覆盖上一次提交

我们通过 git log 查看时会发现, 之前提交的 update readme 没了, 被 update xxx 覆盖了, 并且 update readme 中的修改内容也会被合并一起push.


参考文章:
🔗 git 文档
🔗 详解git commit --amend 用法

意外hard reset解决方案

✅ 意外hard reset解决方案


去年刚开始使用git命令行来管理代码时, 在addcommit之后突然发现问题, 不想push, 就在网上搜了一些教程, 但也没细看, 就使用了 git reset --hard 指令...

接着我就看到了我写了好几天的代码一下全没了, 整个人瘫坐在椅子上, 心态炸了...

为了避免遇到同样的事情(脑子又抽了的话), 在这里记录一下 意外 hard reset之后的补救措施.

首先了解一下 --hard--soft 的区别:

  • git reset -–hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容,撤销的commit中所包含的更改被冲掉.

  • git reset –-soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可;

补救措施来了 !!!

如果你意外的做了 git reset --hard, 你是可以找回你的提交 (commit) 👉 因为Git对每件事都会有日志,且都会保存几天。

// 查看 commit 列表, 会有对应的版本号
$ git reflog

// 找到我们需要的commit的版本号, 如SHA1234, 一般是最近一次的commit的版本号
$ git reset --hard SHA1234

如此就完成了!!!


参考文章:
🔗 45 个 Git 经典操作场景,专治不会合代码
🔗 git reset --hard 和 git reset --soft区别

git 入门(一)

git 入门(一)

配置 / 创建 / 推送 / 查看信息等常用指令汇总:

  • git config --global user.name "Your Name"
  • git config --global user.email "[email protected]"
  • git config -l

git config 命令中的 --global 参数,表示这台机器上所有的 Git 仓库都会使用这个配置,配置好之后可以使用 git config -l 查看配置。

  • git clone xxx 从远端git仓库克隆一份到本地
  • git init 创建本地仓库
  • git add <file> 添加文件到缓存区(可以理解成提交想要提交的文件)
  • git add . 将工作区所有改动文件都提交到缓存区
  • git commit -m xxx 将缓存区的内容提交到本地仓库,xxx为提交日志
  • git push 本地仓库内容提交到远端
  • git pull 从远端获取更新到本地
  • git stash 查看当前文件状态(哪些在缓存区,哪些在工作区
  • git log 查看日志信息
  • git diff 查看差别,git diff commitid 查看与某次提交的改动(commitid, 提交的哈希值,通过git log 可知)

clone 和 init 都是仓库初始化的方式, 不同的是 init 是先建立本地仓库,如果有需要可以公开,比如发到 GitHub 上托管,多人协作等。而 clone 是已经有远程仓库了,克隆复制一份到本地。

  • git remote add origin xxx 本地仓库添加到远端,xxx 是在远端创建的仓库地址,如 https://github.com/Douc1998/Git-Notes
  • git push -u origin master 把本地仓库内容推送到远端。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.