![](https://i-blog.csdnimg.cn/blog_migrate/8f4ff957b8d1180debfe2218ef26bbce.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fdb204582ae5c5e972142c816a911ec9.png)
1、操作实例
1.1、代码冲突提交:
推送新代码发现代码冲突,master不会允许本次推送继续进行,此时需要一系列新操作。
首先撤销上次 commit 操作,git reset --soft HEAD^
保存现有的开发代码,git stash
将最新的代码拉下来与本地代码合并,git pull
git stash pop
释放之前的修改代码,对于有冲突可以通过 vim 打开代码进行手工merge
git add、git commit
之后进行代码的远程推送
1.2、上传部分文件
修改或添加了多个文件,但只想提交部分代码。此时需要遵循以下操作:
git add config/esqueryconfig.php //将对应的想要提交的文件提交到暂存区
git stash -u -k //忽略其他,关键一步
git status //可以看到只有一个文件需要commit
git commit -m ‘注释语句’ //提交暂存区
git push //推到远端仓库
git stash pop // 命令恢复之前缓存的工作
1.3 git checkout分支管理
掘金:使用git进行分支管理
推送本地分支到远程分支仓库:
$ git checkout -b feature-branch //创建并切换到分支feature-branch
$ git push origin feature-branch:feature-branch //推送本地的feature-branch(冒号前面的)分支到远程origin的feature-branch(冒号后面的)分支(没有会自动创建)
1.4 本地已经存在的项目与github发生关联
切换到本地项目地址
git init 初始化项目。该步骤会创建一个 .git文件夹是附属于该仓库的工作树。
git add .
git commit -m ‘initial commit’
git remote add origin https://github.com/pod4g/sku.git 把本地项目和github远程仓库发生关联
有时可能需要将原有的origin重新命名:git remote rename origin new-name
git push -u origin master 把本地项目push到远程github仓库
本地仓库与远程仓库解除关联 rm -rf .git 删除该仓库的工作树即可。
-
使用git在本地新建一个分支后,需要做远程分支关联。如果没有关联,git会在下面的操作中提示你显示的添加关联。
关联目的是在执行git pull, git push操作时就不需要指定对应的远程分支,你只要没有显示指定,git pull的时候,就会提示你。
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
解决方法就是按照提示添加:git branch --set-upstream-to=origin/remote_branch your_branch
其中,origin/remote_branch是你本地分支对应的远程分支;your_branch是你当前的本地分支。 -
如果你是git pull或者git push报fatal: refusing to merge unrelated histories
可以尝试: git pull origin master --allow-unrelated-histories
1.5 跨分支转移修改工作内容
比如我在A分支做了一些修改,现在由于某种原因(如A分支已经合并到master)不能把A分支上修改的东西保留下来但是需要把A分支上修改的东西继续在新分支继续修改。那么现在我们可以有两种简单的做法完成这一需求。
第一种方法:
我们不需要在A分支做commit,只需要在A分支新建B分支,然后切换过去。这个时候你会发现修改的东西在A,B分支都有。这个时候在B分支commit,那么这些修改保留在B分支上,再切换到A分支上会发现修改都没有保留下来。
第二种方法:
使用git stash 将A分支暂存起来,然后在某一个分支(如master分支)新建一个分支B,然后在B分支上使用git stash pop 将修改弹出到B分支上,然后这些修改就在B分支上了。然后我们又可以愉快的玩耍了~
2、git 语法
2.1、 git log
git log主要是用于github代码的版本管理,可以进行不同历史版本代码的回滚。
回滚commit记录:
方法1: git reset --hard HEAD ^ ( ^ 表示回到上一个版本,如果需要回退到上上个版本的话,将HEAD^改成HEAD^^, 以此类推。那如果要回退到前100个版本,这种方法肯定不方便,我们可以使用简便命令操作:git reset --hard HEAD~100 );
方法2:git reset --hard 版本号,可以通过如下命令获取到版本号:git log
reset后跟参数含义:
reset 为 重置到这次提交,将内容重置到指定的版本。git reset 命令后面是需要加2种参数的:–hard 和 --soft。这条命令默认情况下是 --soft。默认参数 -soft,所有commit的修改都会退回到git缓冲区;参数–hard,所有commit的修改直接丢弃
$ git reset --hard HEAD^ 回退到上个版本
$ git reset --hard commit_id 退到/进到 指定commit_id
推送到远程
$ git push origin HEAD --force
版本穿梭
当你回滚之后,又后悔了,想恢复到新的版本怎么办?可以用git reflog打印你记录你的每一次操作记录
$ git reflog
输出:
c7edbfe HEAD@{0}: reset: moving to c7edbfefab1bdbef6cb60d2a7bb97aa80f022687
470e9c2 HEAD@{1}: reset: moving to 470e9c2
b45959e HEAD@{2}: revert: Revert "add img"
470e9c2 HEAD@{3}: reset: moving to 470e9c2
2c26183 HEAD@{4}: reset: moving to 2c26183
0f67bb7 HEAD@{5}: revert: Revert "add img"
找到你操作的id如:b45959e,就可以回退到这个版本
$ git reset --hard b45959e
可见版本回退一文中廖雪峰的总结:
-
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
-
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
-
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
退出git log
执行 git log后想退出:按键q即可如常退出,约等于Esc的神奇功效
2.2、 git stash
用到git stash的情境是当时自己download代码下来之后进行了一段时间的开发,后面希望拉一下最新版的代码并和我开发后的代码进行融合,所以在巧姐指导下使用git stash。大致就是git stash命令先把当前进度保存起来,然后git pull拉下来最新代码,使用git stash pop来恢复之前的进度;对于两部分代码起冲突的部分则需要人工来处理。
git stash
保存当前工作进度,会把暂存区和工作区的改动保存起来。执行完这个命令后再运行git status命令,就会发现当前是一个干净的工作区,没有任何改动。使用git stash save 'message…'可以添加一些注释
git stash list
显示保存进度的列表。也就意味着git stash命令可以多次执行,每次运行都会生成相应的git ID。
git stash pop [–index] [stash_id]
git stash pop 恢复最新的进度到工作区。git默认会把工作区和暂存区的改动都恢复到工作区。
git stash pop --index 恢复最新的进度到工作区和暂存区。(尝试将原来暂存区的改动还恢复到暂存区)
git stash pop stash@{1}恢复指定的进度到工作区。stash_id是通过git stash list命令得到的
通过git stash pop命令恢复进度后,会删除当前进度。
git stash apply [–index] [stash_id]
除了不删除恢复的进度之外,其余和git stash pop 命令一样。
git stash drop [stash_id]
删除一个存储的进度。如果不指定stash_id,则默认删除最新的存储进度。
git stash clear
删除所有存储的进度。
2.3、 git remove
项目进行中有时有部分文件或者文件夹,属于实验性的中间文件,但是push或者commit到git 远程仓库了,这个时候临时写gitignore已经不赶趟了,此时可以借助git remove命令解决这个问题。
git add 操作时,有时会误添加一些不想提交的文件,如何解决?
1、误add单个文件
git reset HEAD 将file退回到unstage区
2、误add多个文件,只撤销部分文件
git reset HEAD 将file退回到unstage区
git rm 与 git reset的区别
git rm:用于从工作区和索引中删除文件
git reset:用于将当前HEAD复位到指定状态。一般用于撤消之前的一些操作(如:git add,git commit等)。
git rm file_path删除暂存区和分支上的文件,同时工作区也不需要
git rm --cached file_path 删除暂存区或分支上的文件, 但工作区需要使用, 只是不希望被版本控制(适用于已经被git add,但是又想撤销的情况)
git reset HEAD 回退暂存区里的文件