学习Git有一段时间了,一路上也一直在写有关于Git方面的文章,但总觉得不是我想要的,就是感觉有点肉肉的,不够直接,不够马上出效果,所以才有了这篇文章,当然这文章可能会不断更新和修正,希望读者可以作为一个工具文章使用,我也会努力将其优化的更加的符合工作场景
说明
1、在[...]中的内容,需要根据实际情况进行修改
要解决这个问题,需要使用SSH秘钥的方式,接下来我就讲一下怎么进行配置。
1.在本地生成私钥和公钥
git config --global user.name "username"//用户昵称git config --global user.email "emailAddress"//github或者gitlib的邮箱地址ssh-keygen -t rsa -C "emailAddress"//github或者gitlib邮箱账户地址
2.将电脑上的公钥与远程仓库进行绑定
本地会在上面的步骤中会生成一个id_rsa.pub(默认情况是这个名称),将该文件中的内容copy到远程仓库github或gitlib的settings的SSH配置选项中。
Tittle名称自由发挥
将远程的数据复制一份到本地
#【仓库copy地址】git clone [git@rep.xx.com:zoeminghong/hello.git]
现在打算将本地的工程,放到Git仓库进行托管了,并且远程Git仓库已经创建了该项目的工程
#本地初始化工程,会生成一个.git文件git init #将本地的工程与远程仓库中的项目进行关联(不用关心项目名不一致的问题)#此时本地工程与远程仓库已经建立了联系git remote add origin [git@rep.xx.com:zoeminghong/hello.git] #将本地所有文件添加到Git中,进行监管git add . #将内容提交 【提交注释】git commit -m "[...]" #将本地的内容同步到远程仓库中git push -u origin master
git show [十六进制码]
git log --graph --pretty=oneline --abbrev-commit
git ls-files -u
本地代码未commit的前提下,解决与远程代码冲突问题
git pull #失败#将当前修改进行暂存起来git stash#或git stash save "[注释]" #获取最新的远程仓库代码git pull #恢复暂存的内容git stash pop#stash其他操作#恢复最近一次save的原工作区内容,,并删除stash记录git stash pop#恢复最近一次save的原工作区内容,但不删除stash记录git stash apply#删除stash记录git stash drop#获取暂存列表git stash list
但,上面的也可能存在问题,由于本地存在未被追踪的文件,并且远程仓库pull的时候也存在同名的文件,就会存在pull失败,在这种情况下,在
git stash
后面追加--include-untracked
,会将远程的文件与本地的文件融合stash只会保存当前索引和工作目录的状态,其保存的是add和commit的中间状态,如果还没有被git追踪的文件,是不会被记录的
git stash savegit pull --rebase
git stash branch [newBranchName]
git stash show -p stash{0}
本地代码已经commit后,解决与远程代码冲突问题
# 获取远端库最新信息 【分支名称】git fetch origin [master] # 做比较git diff [本地分支名] origin/[远程分支名] # 拉取最新代码,同时会让你merge冲突git pull
方法2
# 获取最新代码到tmp分支上 [远程的分支:本地分支]git fetch origin [master:tmp] # 当前分支与tmp进行比较git diff tmp # 修改冲突部分,进行本地commit操作git add . git commit -m "[...]" # 将tmp中内容合并到当前分支中git merge tmp # 删除分支git branch -d tmp
保留副本操作
git rm --cache [文件名]
直接文件删除
git rm [文件名]
还原到最近的版本,废弃本地做的修改(当前文件修改没有进行add操作的时候)
git checkout -- [文件名]
取消已经暂存的文件(撤销先前"git add"的操作)
#当前HEAD,返回到上一次commit点,不会有任何日志记录git reset HEAD --hard
git reset HEAD [文件名]
回退所有内容到上一个提交点
#最近内容已经commit的情况下git reset HEAD^ --hard
回退这个文件的版本到上一个版本
#最近内容已经commit的情况下git reset HEAD^ [文件名]
将本地的状态回退到和远程的一样
git reset –-hard origin/[分支名]
回退到某个版本
# 获取所有的HEAD更改信息的sha1值git refloggit reset [SHA1]
回退到上一次提交的状态,按照某一次的commit完全反向的进行一次commit.(代码回滚到上个版本,并提交git)
git revert HEAD
使用reset是不会有日志记录的,revert则会要提交一个记录点
修改最新的提交信息(修改提交的注释信息)
git commit --amend
本地创建了一个分支,远程也有一个分支,进行两者关联
git checkout -b [本地分支名] origin/[远程分支名]
我们在开发的时候,可能存在线上发布了一个版本,需要给这个版本代码打上一个标签,到时候可以方便回退到这个版本
# 创建tag 【tag名】git tag v1.0 # 查看存在的taggit tag # 将tag更新到远程git push origin --tags
接下来就讲解回退到具体的tag
# 保存当前编程环境git stash # 切换回某个tag(v1.0)git show v1.0 #【sha1】git reset --hard [2da7ef1] # 创建分支来保存tag的数据,tag只是一个节点的标记,无法承载数据的修改记录,【分支名】git checkout -b [bill] # 接着你就可以在这里改啊改了
切换回主干或其他分支
# 切换分支git checkout master # 日志记录git reflog # 显示stash列表git stash list # 恢复之前的工作环境代码git stash apply # 删除stashgit stash drop
分支与主干合并
git add . git commit -m "v1.1" # bill分支合并到当前分支【分支名】git merge [bill]
# 显示暂存区和工作区的差异git diffgit diff [filename] # 显示暂存区和上一个commit的差异【文件名】git diff --cached [hello.txt]git diff --cached [HEAD或者SHA1] [filename] # 显示工作区与当前分支最新commit之间的差异git diff HEADgit diff [HEAD或分支名] [filename] # 显示两次提交之间的差异【分支名】git diff [first-branch]...[second-branch]git diff [SHA1] [SHA1] [filename]#分支之间的差异#分支之间的差异git diff [分支1] [分支2]git diff [分支1]..[分支2]#指定文件git diff [分支1]:[file1] [分支2]:[file2]#查看指定提交范围内的所有变更文件情况git diff --stat master~[范围值] [分支名]git diff --stat master~5 tmp//还可以值查看具体某一个文件git diff --stat master~5 tmp test.txt
#先确定范围git bisect bad #一般都是当前HEAD是坏提交【sha1】git bisect good a794f9bd96f06b57b4c10433e4d6abb3f0855749 #上面的步骤就是确定范围的,接下来就是回答git的问题,他指定的提交点是好的还是坏的git bisect good//如果是坏的,就bad,直到你找到哪个提交点导致出现问题#查看维护日志git bisect log#完成操作后,要回切到工作分支上git branchgit bisect resetgit branch
git blame -L [起始行数],[文件名]
#以当前节点作为分支的开始起点git branch [分支名]#以SHA1作为分支开始起点git branch [分支名] [SHA1]#创建并切换分支,sha1以哪个节点作为分支的起点git checkout -b [分支名] [SHA1]
在git中重命名远程分支,其实就是先删除远程分支,然后重命名本地分支,再重新提交一个远程分支。
//显示现在分支git branch -av//删除远程要删除的分支develgit push --delete origin devel//重命名本地分支devel为developgit branch -m devel develop//推送到远程git push origin develop
这是由于在 github 中,devel 是项目的默认分支。要解决此问题,这样操作:
进入 github 中该项目的 Settings 页面;
设置 Default Branch 为其他的分支(例如 master);
重新执行删除远程分支命令。
git branch -a
git fetch origin [远程仓库分支名] [本地仓库分支名]
git branch -d [分支名]
git show-branch#或git branch
分支前面都存在*或者!
*表示当前分支
在–之后的是记录分支的提交信息
像
*+ [tmp] 远程2
就表示该提交存在于两个分支中
git show [分支名]:[文件名]
git show [SHA1] [文件名]
如果存在未被git追踪的文件,git是会将其忽略的
如果存在已追踪且被修改或删除,必须commit之后,才能切换
如果要不计后果的情况,强切,加
-f
假如你希望变更作用于另一个分支上,但由于当前分支如果不提交,是无法切换到另一个分支上的
git checkout -m [另一个分支名]
#当前分支,得到dev分支中dev~2之前的所有提交内容git cherry-pick dev~2
cherry-pick会生成一条新的提交记录
系列文章:
git rebse的变基提交
Git如何帮你查原因
从使用场景学Git
更多内容可以关注微信公众号,或者访问AppZone网站
联系客服