首页 > 技术文章 > 【本博客所有关于git文章迭代汇总】git操作(暂存,回退,绑定远程等),看这一篇就够了

youqiancheng 2019-11-05 15:46 原文

1、git常用操作

git 小白操作,无非是clone,然后拉取,提交分支,第一次clone的时候,关联远程分支可能会遇到问题,可以看第四条git关联远程分支

# 在当前目录新建一个Git代码库
$ git init

# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]

# 下载一个项目和它的整个代码历史
$ git clone [url]
 
$ git status 获取修改的内容
$ git add * 上传修改的内容

$ git commit -m '注释信息'  添加注释  如果没有添加注释 出现绿色字提示  
输入  :wq 退出
 
$ git push  提交代码  origin master

$ git push -u origin master 第一次推送

$ git pull  拉取代码

$ git checkout ymtc@xxx 转到ymtc分支
$ git merge ymtc@develop 合并分支  

这里第一次推送需要注意,本地推送到远程用git push命令,实际是把当前master分支推送到远程。

由于远程仓库是空的,我们第一次推送的时候,加了-u参数。git不但会将本地的master分支推送到远程新master分支,还会把本地master分支和远程master分支关联起来。

在以后的推送和拉取时可以简化命令。推送成功以后,可以立刻看到远程仓库的内容已经和本地一摸一样了。

 

2、git stash 暂存

周一上班,本来想干活的,一看自己在预发分支,切develo分支还切不过去,一看自己可能周六加班脑袋不清楚,在release分支上面修改了代码。

此时,我也不想在release上面提交,然后解锁了git stash,发现这个贼好用。

有时候工作区还在改动,但是要提交。如果有不想提交的,就会报错。
正确的方法是,stash一下,提交之前add的内容,提交完以后,再pop弹出。

使用场景:

1 当正在dev分支上开发某个项目,这时项目中出现一个bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash命令将修改的内容保存至堆栈区,然后顺利切换到hotfix分支进行bug修复,修复完成后,再次切回到dev分支,从堆栈中恢复刚刚保存的内容。

2 由于疏忽,本应该在dev分支开发的内容,却在master上进行了开发,需要重新切回到dev分支上进行开发,可以用git stash将内容保存至堆栈中,切回到dev分支后,再次恢复内容即可。

总的来说,git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。

这也就是说,stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。

# 暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop

 更多git stash 说明,看git stash详解 篇文章

3、git 回退版本

工作中,有时候合并分支导致项目大乱,小白就懵圈了。这时候大佬祭出reset,回退到指定版本,或者上一版本,完美解决。

git reset 有三种模式

reset --hard:重置stage区和工作目录: reset --hard 会在重置 HEAD 和branch的同时,重置stage区和工作目录里的内容。当你在 reset 后面加了 --hard 参数时,你的stage区和工作目录里的内容会被完全重置为和HEAD的新位置相同的内容。换句话说,就是你的没有commit的修改会被全部擦掉。

reset --soft:保留工作目录,并把重置 HEAD 所带来的新的差异放进暂存区 reset --soft 会在重置 HEAD 和 branch 时,保留工作目录和暂存区中的内容,并把重置 HEAD 所带来的新的差异放进暂存区。

reset 不加参数(mixed):保留工作目录,并清空暂存区 reset 如果不加参数,那么默认使用 --mixed 参数。它的行为是:保留工作目录,并且清空暂存区。也就是说,工作目录的修改、暂存区的内容以及由 reset 所导致的新的文件差异,都会被放进工作目录。简而言之,就是「把所有差异都混合(mixed)放在工作目录中」。

重置暂存区与工作区,与上一次commit保持一致

$ git reset --hard

重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变

$ git reset [commit历史版本号]

重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致

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

$ git push -f 强制提交

soft是回退,版本修改了,保存了,但是没有add的状态

git reset --hard HEAD^ 是完全擦除了上次提交的记录,git push -f 强制提交以后,线上的最近一次的版本也擦除了。

另:

后来又遇到新问题了,reset hard就是强制回退到之前版本,在此基础上的修改,会比远程仓库的落后(behind),所以怎么都push不上去,搞了一两个小时。

最后一步push的时候用以下命令就可以了。

$ git push origin 分支 --force

git reset 和 git revert 的区别

git revert是用一次新的commit来 回滚之前的commit,git reset是直接 删除指定的commit。

在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。
git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。

 

4、git 克隆,提交本地修改到远程,以及关联远程分支

github 上克隆项目,绑定本地分支搞了好久,以下是总结

$ git clone
 
$ git init
 
# 切换到需要保存文件的文件夹
$ cd shop
 
$ git branch -al //查看所有分支
 
$ git pull origin master //拉取
 
$ git branch -vv //绑定本地和远程分支
 
$ git pull //再次拉取
 
$ git status //查看状态
 
$ git add *
 
$ git commit -m '提交测试'
 
$ git push

 参考与扩展:https://blog.csdn.net/weijinqian0/article/details/76217014

 

5、合并指定分支

工作中又遇到一个问题,我们系统有两个分支,两个分支的内容不同,但是两个分支都需要优化,优化的提交有相同的部分。

如果按照死方法,就是两个分支分别敲代码,效率很低。

后来找到这个方法,将A分支指定提交合并到B分支,完美解决。

$ git cherry-pick +分支的哈希值版本号

参考与扩展阮一峰:git cherry-pick 教程 

6、github提交代码,快速通道

#本地初始化git目录
git init

#新建文件并且写入内容 touch a.txt
echo "new data" >> a.txt

#添加到暂存区
git add .

git commit -m "a.txt"

#添加远程仓库
git remote add origin 地址

#本地仓库也远程仓库关联
git branch --set-upstream-to=origin/master master

#拉取远程仓库内容到本地
这时候用git pull会提示(毕竟本地和远程仓库没啥关系指针连接不起来的缘故吧):

fatal: refusing to merge unrelated histories

因此命令应该改为:

git pull origin master --allow-unrelated-histories

#将最新的内容推送到远程仓库
git push origin master

  

6、其他命令

$ git pwd 用于显示当前的目录
 
$  git rm 文件名 删除文件

 命令汇总:

#git 命令

git init //初始化git 工程

git remote -v //查看远程仓库地址

ls -a // 查看本地仓库文件

ls // 查看本地仓库文件,但是不显示 以点开头的文件

git branch -d <branch_name>/git branch -D <branch_name> // 删除分支

git reset --hard FETCH_HEAD //拉取出错时,里面包含此字段可以用这个命令解决

echo "文件内容" >> README.md  // 创建文名为README.md ,并写入内容

git status //命令用于显示工作目录和暂存区的状态

git clone 项目url //从服务端克隆项目

git checkout -b dev //我们创建dev分支并切换到dev分支

git branch  会列出所有分支,当前分支前面会标一个 *号。

git branch //查看本地分支

git branch -r //查看远程分支

git branch -a // 查看本地分支和远程分支 远程分支为红色 当前分支前面带有 * 号

git fetch //远程仓库不显示时,使用此命令

git remote -v //查看所有远程地址

git checkout -t remotes/origin/video_dev(remotes/origin/video_dev:远程分支名)//切换分支

git pull --rebase //更新代码

#提交

git commit -am "<提交说明>" //将所有修改,但未进stage的改动加入stage,并记录commit信息;
git commit -m"提交说明" //提交代码到本地仓库
git push -u origin master   //推到远程
git push -u origin master   //强制推到远程
git push <远程主机名> <本地分支名>(冒号)<远程分支名> //也就是 $git push origin master(冒号)master 推送到远程
git add . / //添加到git
首先git pull 然后 git checkout 分支名字 //切换分支命令
git push origin master:master //推送到远程
git push origin master:分支名字 //推送到远程

 

其他参考:
阮一峰git文章 http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html

文章会持续迭代,欢迎关注!收藏!转发!

如果你在工作中有什么关于git的好方法,好命令,也可以留言,看到会迭代进去。

推荐阅读