本文共 10059 字,大约阅读时间需要 33 分钟。
git status # 查看状态git add . # 将变动文件添加 从到工作区添加到 缓存区git commit -m "提交信息" # 提交代码到 本地仓库git push origin master # 将本地仓库代码 推送到 远程仓库git pull # 默认参数为 --merge 将远程仓库代码 拉取到 本地仓库后 merge 到本地代码git pull --rebase # 将远程仓库代码 拉取到 本地仓库后 rebase 到本地代码
命令用来从你的工作目录中删除所有没有tracked过的文件
用法:
git clean -n是一次clean的演习, 告诉你哪些文件会被删除。记住他不会真正的删除文件,只是一个提醒。git clean -f删除当前目录下所有没有track过的文件。他不会删除.gitignore文件里面指定的文件夹和文件, 不管这些文件有没有被track过。git clean -d 删除指定路径下的没有被track过的文件夹。git clean -df删除当前目录下没有被track过的文件和文件夹。git clean -xf删除当前目录下所有没有track过的文件,不管他是否是.gitignore文件里面指定的文件夹和文件。
git reset --hard和git clean -f是一对好基友. 结合使用他们能让你的工作目录完全回退到最近一次commit的时候。
git clean -df && git reset --hard && git pull --rebase
参考自:
适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。 原理: git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本,如下图所示,假设我们要回退到版本。你的stage区和工作目录里的内容会被完全重置为和HEAD的新位置相同的内容。换句话说,就是你的没有commit的修改会被全部擦掉。
使用场景:
注意:
此命令为重置 工作区域和缓存区域的已有文件的修改,对工作区域内的新增文件不做处理,对缓存区域的新增文件进行重置。这是因为add是将文件纳入版本管理并缓存修改。如果没有纳入版本控制是不会进行缓存修改的。# 查看版本号的两种方法git loggit reflog
git reset --hardgit reset --hard HEAD # 删除当前版本中 工作区域和缓存区域的新增文件git reset --hard HEAD^ # 切换到上一个commit版本git reset --hard 版本号 # 切换到指定的版本号
此模式下会保留 working tree工作目录的內容,不会改变到目前所有的git管理的文件夹的內容;也会保留 index暂存区的內容,让index 暂存区与 working tree 工作目录的內容是一致的。就只有 repository 中的內容的更变需要与 reset 目标节点一致,因此原始节点与reset节点之间的差异变更集合会存在与index暂存区中(Staged files),所以我们可以直接执行 git commit 將 index暂存区中的內容提交至 repository 中。当我们想合并「当前节点」与「reset目标节点」之间不具太大意义的 commit 记录(可能是阶段性地频繁提交)時,可以考虑使用 Soft Reset 来让 commit 演进线图较为清晰点。
使用场景:
原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files),所以假如我们之前工作目录没有改过任何文件,也没add到暂存区,那么使用reset --soft后,我们可以直接执行 git commit 將 index暂存区中的內容提交至 repository 中。为什么要这样呢?这样做的使用场景是:假如我们想合并「当前节点」与「reset目标节点」之间不具太大意义的 commit 记录(可能是阶段性地频繁提交,就是开发一个功能的时候,改或者增加一个文件的时候就commit,这样做导致一个完整的功能可能会好多个commit点,这时假如你需要把这些commit整合成一个commit的时候)時,可以考虑使用reset --soft来让 commit 演进线图较为清晰。总而言之,可以使用–soft合并commit节点。git reset --soft 版本号 # 切换到指定的版本,保留当前工作区、缓存区数据, # 并把版本之间差异存入到缓存区中。
reset 如果不加参数,那么默认使用 --mixed 参数。它的行为是:保留工作目录,并且清空暂存区。也就是说,工作目录的修改、暂存区的内容以及由 reset 所导致的新的文件差异,都会被放进工作目录。简而言之,就是「把所有差异都混合(mixed)放在工作目录中」。
使用场景:
git reset 版本号 git reset --mixed 版本号
git reset --mixed 与git reset --soft之间的差异:
工作目录的内容和 –soft 一样会被保留,但和 –soft 的区别在于,它会把暂存区清空,并把原节点和reset节点的差异的文件放在工作目录,总而言之就是,工作目录的修改、暂存区的内容以及由 reset 所导致的新的文件差异,都会被放进工作目录a> reset 的本质:
移动 HEAD 以及它所指向的 branch b>区别:git stash这个命令可以将当前的工作状态保存到git栈,在需要的时候再恢复
保存当前的工作区与暂存区的状态,把当前的工作隐藏起来,等以后需要的时候再恢复,git stash 这个命令可以多次使用,每次使用都会新加一个stash@{num},num是编号。
git stash # 缓存git stash save "add test_njh" # 缓存并mark
默认恢复git栈中最新的一个,也可以指定缓存stash@{num},pop后将自动删除选中缓存。
git stash pop # 默认为最新的缓存git stash pop stash@{ 0} # 指定最新的缓存
查看所有被隐藏的文件列表
git stash list
恢复被隐藏的文件,但是git栈中的这个不删除,用法:git stash apply stash@{0},如果我们在git stash apply 的时候工作目录下的文件一部分已经加入了暂存区,部分文件没有,
当我们执行git stash apply之后发现所有的文件都变成了未暂存的,如果想维持原来的样子,即暂存过的依旧是暂存状态,那么可以使用 git stash apply --index。pop后将继续保存选中缓存。git stash apply stash@{ 0}
删除指定的一个进度,默认删除最新的进度,使用方法如git stash drop stash@{0}
git stash drop stash@{ 0}
删除所有存储的进度
git stash clear
显示stash的内容具体是什么,使用方法如 git stash show stash@{0}
git stash show stash@{ 0}git stash show stash@{ 1}
git stash --help
适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。
原理: git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。# 1,查看log版本git log # 或者git reflog# 2,revert版本git revert -n 版本号# 3,commit提交git commit -m "***"# 4,push git push origin devlop:devlop
意义:查看文件在工作目录与暂存区的差别。工作目录 vs 暂存区
git diff
也可查看和另一分支的区别。
git diff
意义:查看工作目录同Git仓库指定 commit 的内容的差异。工作目录 vs Git仓库
<commit>=HEAD
时:查看工作目录同最近一次 commit 的内容的差异。 git diff
意义:表示查看暂存区与本地仓库内容的差异。暂存区 vs Git仓库
git diff --cached
也可查看和另一分支的区别。
git diff --cached
意义:Git仓库任意两次 commit 之间的差别。Git仓库 vs Git仓库
git diff
以上命令可以不指定 ,则对全部文件操作。
以上命令涉及和 Git仓库 对比的,均可使用git log 或者 git reflog 指定 commit 的版本。Git 中的 HEAD 可以理解为一个指针,我们可以在命令行中输入 cat .git/HEAD 查看当前 HEAD 指向哪儿,一般它指向当前工作目录所在分支的最新提交。
cat .git/HEAD # -----ref: refs/heads/devlop # 指针指向devlop分支
意义:表示查看工作区和缓存区中,加入到版本管理的文件的修改。
意义:表示当没有提交版本号时将工作区的指定文件的内容恢复到暂存区的状态.
git checkout . 将工作区的所有文件的内容恢复到暂存区的状态。(工作区新增的文件不做修改)意义:表示切换分支.
意义:表示以当前分支的当前状态创建新分支并切换到新分支 -b 表示创建新分支
意义:表示以当前分支的commitID提交节点创建新的分支并切换到新分支。此时工作区的内容和切换分之前commitID提交节点的内容一样。
意义:是以指定的提交节点创建了一个临时性分支,此临时性分支可用于做实验性修改。
意义:当有提交版本号时,表示将工作区和暂存区都恢复到版本库指定提交版本的指定文件的状态,此时HEAD指针不变,此时的状态相当于把工作区的内容修改到指定版本的文件内容后,再把修改的内容添加到暂存区。因此git checkout < commit > filename后,可以直接执行git commit而不需要先执行git add。
在分支合并时,有两种方式:git merge 和git rebase
# git merge:git merge 分支名# git rebase:git rebase 分支名
例如:
现在在master分支上创建一个dev分支,然后在dev分支上进行两次提交,添加dev1.txt,dev2.txt,日志信息如下: 同时在master分支上进行两次提交,添加master1.txt,master2.txt,日志信息如下: 现在要把dev分支合并到master分支使用merge命令合并:git merge dev 使用rebase命令合并:git rebase dev
Git 会从两个分支的共同祖先8eda20d开始提取 master 分支(当前所在分支)上的修改,即 e0779e1、ae0decb,再将 master 分支指向 dev的最新提交(目标分支)即 e45d38f处,然后将刚刚提取的修改依次应用到这个最新提交后面。操作会舍弃 master 分支上提取的 commit,同时不会像 merge 一样生成一个合并修改内容的 commit,相当于把 master 分支(当前所在分支)上的修改在 dev分支(目标分支)上原样复制了一遍。总结
git fetch <远程主机名>远程主机名>
上面命令将某个远程主机的更新,全部取回本地;通常用来查看其他人的代码进程,因为它取回的代码对你本地的开发代码没有影响;
git fetch <远程主机名> <分支名>分支名> 远程主机名>
上面命令取回特定分支的更新;
例如(取回origin主机的master分支 ):
git fetch origin master# 取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取。# 比如origin主机的master,就要用origin/master读取;
## 在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支;$ git fetch origin master:temp## 比较本地代码与刚刚从远程下载下来的代码的区别;$ git diff temp## 合并temp分支到本地的master分支;$ git merge temp## 如果不想保留temp分支,删除;$ git branch -d temp
git fetch创建并更新本地远程分支。即创建并更新origin/xxx 分支,拉取代码到origin/xxx分支上;在FETCH_HEAD中设定当前支-origin/当前分支对应,如直接到时候git merge就可以将origin/abc合并到abc分支上;git fetch origin手动指定了要fetch的remote。在不指定分支时通常默认为master;git fetch origin dev指定远程remote和FETCH_HEAD,并且只拉取该分支的提交;
意义:git pull包含有两个操作,一个是fetch远程的代码,一个是将本地当前的代码和远程代码进行merge,即git fetch + git merge。
其实git pull还有一个参数可以加,即git pull -rebase,其最终效果和git pull一样,也会fetch到远程代码。即git pull默认使用的是merge模式,那么git pull -rebase指定使用rebase模式。git pull git pull --rebase / gitpull -r / git pull origin devlop --rebase
意义:查看本地所有分支和所在分支
意义:查看远程所有分支
意义:查查看本地和远程分支
意义:新建分支
意义:删除分支
意义:删除远程分支,删除后还需推送到服务器
意义:删除远程的分支
意义:重命名本地分支
原理: git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本,如下图所示,假设我们要回退到版本。
适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。查看commit提交版本
命令版本回退到目标版本号
使用git push -f 强制推送
注意: 1, git push 直接提交会报错。 2, 主干master上不能执行此操作。原理: git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。
适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。使用 git log 查看版本
(1)revert,使用“git revert -n 版本号”命令。
git revert -n 0f7f2bdffa3775b65561625f4d7a68dfeccd6c69注意: 这里可能会出现冲突,那么需要手动修改冲突的文件。而且要git add 文件名。
(2)提交,使用“git commit -m 版本名”,如:
git commit -m "revert add b.py"
git push origin devlop:devlop
# 报错信息如下: There is no tracking information for the current branch.Please specify which branch you want to merge with.See git-pull(1) for details
出现该问题因为 在进行git pull / push操作时 没有指定branch而产生的报错信息。
git branch --set-upstream master origin/mastergit branch --set-upstream develop origin/developgit branch --set-upstream-to=origin/develop develop或者: git pull origin develop --rebasegit pull origin master --rebase
git remote show origin
git remote prune origin
转载地址:http://riili.baihongyu.com/