仅用于记录使用Git指令时遇到的一些问题及其解决方案, 以便后续遇到同样问题时查看...
🔗 查看跳转 👉 Issues
Solution for problems appeared during using Git
仅用于记录使用Git指令时遇到的一些问题及其解决方案, 以便后续遇到同样问题时查看...
🔗 查看跳转 👉 Issues
分支创建 / 管理 / 删除等操作:
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 缓存内容。在写项目的时候, 在git add .
=> git commit -m 'xxx'
之后, 但是还没push. 我突然想 取消这次 commit
, 该怎么办呢?
如果你还没有推到远程, 把Git重置 (reset
) 到你最后一次提交前的状态就可以了:
$ git reset --soft HEAD@{1}
当然, 使用 reset
指令后, 同时会保存暂存的变化, 不用担心之前修改的代码丢失 !
参考文章:
🔗 45 个 Git 经典操作场景,专治不会合代码
情景:当 A 在主分支上修改了某个文件 test.txt 中的第一行文字,此时 B 也在分支上 branchB 修改了该文件的第一行文字,如果 B 使用 git merge master
指令合并分支,那自然会发生冲突。
解决方法:
当出现冲突后,文件中会出现下面的冲突内容:
其中 >>>
到 ===
中间的内容是 A 在 master 分支上修改的内容,===
到 <<<
之间的内容是 B 在 branchB 分支上修改的内容。当出现问题之后,我们需要手动修改冲突,如下:
我们需要删除提示信息,并且把对应的冲突内容和另一名开发成员协商(假设是都保留),那么就留下最后两行内容即可。之后使用 add
、commit
、push
等一系列操作进行推送。
除了使用 git merge
合并分支,我们也可使用 git rebase
合并分支。假设现在存在两个分支 master
和 feature
,它们都各自进行了若干版本的更新,此时需要把 master
分支合并到 feature
上。我们知道可以使用以下指令:
git checkout feature
git merge master
git merge
合并分支会在 feature 分支中创建一个新的 merge commit
,它将两个分支的历史联系在一起,请看如下所示的分支结构:
由上图可知,整个 git 版本提交和流程不再是线性,而是先分叉为二叉树,再合并。此外,也多了一次 merge commit
的提交操作,这也意味着可能会污染你的 feature 分支历史记录。
如果使用 git rebase
就可以解决这种非线性操作的问题。git rebase
将整个 feature 分支移动到 master 分支的顶端,从而有效地整合了所有 master 分支上的提交。但是,与 merge 提交方式不同,rebase 通过为原始分支中的每个提交创建全新的 commits 来重写项目历史记录。
执行流程如下:
git checkout feature
git rebase master
rebase 的优点在于可以获得更清晰的项目历史,不存在额外的提交内容,并且可以产生线性的历史记录,你可以在 feature分支上没有任何分叉的情况下一直追寻到项目的初始提交。
此外,如果没有采用分支开发,而是大家都在同一个分支上开发时,我们在 git push
之前是需要 git pull
的,但是如果别人修改了文件(但是没有产生冲突),我们在 push 之前使用 pull,也会造成一次 merge
的额外提交。因此,我们也可以在 git pull
后加上 --rebase
从而避免这种提交。
git pull --rebase
撤销、删除等操作:
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 -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 用法
去年刚开始使用git命令行来管理代码时, 在add
、commit
之后突然发现问题, 不想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 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-Notesgit push -u origin master
把本地仓库内容推送到远端。A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.