一:基础语法
git init 把工作区变为一个git可以管理的仓库
(1)git add 跟踪要修改的文件(把文件add到了缓存区)
(2)git commit 提交文件到版本库(把缓存区的文件提交到了当前分支)
(3)git status 查看修改过的文件的状态(已跟踪,未跟踪,已提交,未提交)
(4)git log 查看提交的log(最上边儿是最近一次提交的)
显示了:commit_id,auther,commit_date,修改的内容
(5)git reset —head HEAD^ 撤回上一个版本
(6)cat 查看当前文件内容
(7)git reset --hard 3628164 后悔撤回了的那个版本的话执行这个回退到那个版本 3628164是那个版本的版本号(commit_id)
(8)git reflog 查看命令历史
(9)暂存区和工作区的区别
工作区:我们正常工作的目录项目根目录下(.git目录就在工作区,它不是工作区而是git的版本库)
暂存区:存在版本库.git里,通常称为stage,在git init时会为我们创建第一个分支master,以及指向master的指针HEAE
⚠:如果修改的文件没有被add倒暂存区,commit的时候将不会被提交到当前分支(因为git跟踪并管理的是修改而不是文件本身)
(10)git checkout — file (撤回没有add到暂存区的已经修改的文件)
(11)git reset HEAD file (撤回已经add到暂存区但是还没有commit的文件,撤回到了工作区,如果还想还原的话执行checkout命令)
(12)删除文件的时候一定要注意 :(删除的是已经commit 到分支的文件)
⚠:切记不要执行rm file命令,如果实在执行了,可以通过checkout 撤回工作区的修改应为删除工作区的文件也是对工作区文件的修改所以可以通过checkout撤回修改
⚠:删除的时候执行git rm file这时候暂存区文件也给删除了,执行commit提交就行了
⚠:如果是删除没有commit到分支的文件看情况执行rm file或者git rm file
(13)远程仓库
git remote add origin https://github.com/easonlovejiven/learngit.git 关联一个远程仓库
关联之后推送最新的code
git push origin 本地工作分支 (把当前分支推送到远程)
⚠:第一推送时远程是空的所以要加-u参数(git push -u origin 本地工作分支)
(14)分支管理
创建合并分支:
git checkout -b dev 创建并切换到dev分支,相当于:git branch dev ,git checkout dev
git branch 列出本地所有分支
git checkout 分支名 切换分支
git merge 分支名 合并分支
git branch -d 分支名 合并之后就可以删除新建的开发分支了
⚠:新建的分支默认和本地master分支一样的内容
解决分支冲突:
both modified :文件的这个状态证明有冲突了
当merge出现冲突时git无法自动合并,必须手动的修改冲突的文件(merge后修改)修改成要merge的那个分支,修改完后删除要merge的那个分支,然后add,commit提交
git log —graph 查看分支合并图
(15)bug分支
如果要修复bug时,需要建立专门的bug分支来修复,然后合并,最后删除
git stash:存储当前(dev)分支的工作现场(去处理其它分支的事情)
git stash pop:其它分支处理完了,切换到dev分支,恢复之前未完成的工作内容
(16)远程仓库
远程仓库的默认名称是origin
git remote :查看远程分支的名称
git branch origin 本地分支
git pull :更新远程分支最新的修改到本地
(17)标签管理
撤回上次提交
git reset HEAD^
如果删除了一个已经push的本地的分支想要恢复的话,运行git br -a看下远程分支纪录然后运行git co remotes/origin/T183-2 恢复分支
二:高级语法
使远程库强制覆盖本地代码(git pull时出现冲突 放弃本地修改)
git fetch --all 只是下载代码到本地,不进行合并操作
git reset --hard origin/master 把HEAD指向最新下载的版本
本地版本强制覆盖远程版本
git push --force origin
git index.lock锁定文件
rm -f ./.git/index.lock
在你进行某些比较费时的git操作时自动生成,操作结束后自动删除,相当于一个锁定文件,目的在于防止对一个目录同时进行多个操作。有时强制关闭进行中的git操作,这个文件没有被自动删除,之后你就无法进行其他操作,必须手动删除
git Please move or remove them before you can merge
这是因为本地有修改,与云端别人提交的修改冲突,又没有merge。如果确定使用云端的代码,最方便的解决方法是删除本地修改
git clean -d -fx ""
d -----删除未被添加到git的路径中的文件
f -----强制运行
x -----删除忽略文件已经对git来说不识别的文件
常用语法
git pull 等价于 git fetch + git merge
git fetch不会执行自动merge
git pull 和 git pull origin master 和 git pull origin 区别
- 在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动"追踪"origin/master分支
远程分支是与当前分支合并
git pull origin master
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。
git pull origin
如果当前分支只有一个追踪分支,连远程主机名都可以省略
git pull
三:服务器测试操作流程
test服务器是可以支持测试多个分支的服务器,功能之前可以单独区分开。
查看test服务器上在测分支
git cherry -v edge test
当前在测试的分支:
+ f731ace2e6e94fabcdef2d46b08c3fb853e86222 FIX: 修复xxxxbug
+ 428ef667058f2abcdef79189144854e374a0e123 CHG: 母版overflow不再hidden
添加自己的分支
git merge --squash ly-bug(我自己的分支)
效果:
+ f731ace2e6e94fabcdef2d46b08c3fb853e86222 FIX: 修复xxxxbug
+ 428ef667058f2abcdef79189144854e374a0e123 CHG: 母版overflow不再hidden
+ 2ed4e8534e8a861336105798765f62b6fe688cf ly-bug
其他点
当自己的分支已经在test服务器,而自己的分支上有bug,而且你的分支后面还跟着其他测试的分支,这时怎么办?
如下的情况
+ f731ace2e6e94fabcdef2d46b08c3fb853e86222 FIX: 修复xxxxbug
+ 428ef667058f2abcdef79189144854e374a0e123 CHG: 母版overflow不再hidden
+ 2ed4e8534e8a861336105798765f62b6fe688cf ly-bug
+ 2ed4e8534e8a861336105798765f62b6fe688cf 我是后面的分支1
+ 2ed4e8534e8a861336105798765f62b6fe688cf 我是后面的分支2
解决如下:
git reset --hard 428ef667058f2abcdef79189144854e374a0e123
把cntest正在测试的分支加进去
git cherry-pick 2ed4e8534e8a861336105798765f62b6fe688cf
git cherry-pick 2ed4e8534e8a861336105798765f62b6fe688cf
添加自己的分支进去
git merge --squash ly-bug
提交
git push —-force
修改/删除commit信息
大概思路:在branch-a上checkout出新的分支branch-b -》 cherry-pick 那条 commit -》 更改 -》commit --amend
这样就在一条 commit 里了 (edited)
之后就是要么 push -f 到原来的远端分支
或是 push 到新的远端分支
实现的两种方式
1.rebase
git rebase --interactive HEAD~N
说明:如果想删除第三条信息,可以把第三条信息的pick
更改成drop
即可;修改改成edit
,下面都有提示。
pick dfc3509f2 ADD: 七鱼后台配置用户信息,以便展示到客服页面
pick 1f97dd92c FIX: 获取用户信息之后,接着执行用户登出操作
pick a7a5ac1f3 DEL: 删除自动打开七鱼事件
# Rebase 684cf296a..a7a5ac1f3 onto 684cf296a (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
2.cherry-pick
如果分支a上有5个提交,我想删除它的其中一条commit,这时可以创建一个分支b,把需要的分支a中的4个commit cherry-pick到分支b即可。
这时先把branch-a的commit号都记录下来,然后在分支branch-b中执行
git cherry-pick commit_id
最后执行git push --force
other
经常使用git命令,设置快捷键会方便很多,设置方式如下:
修改~/.gitconfig,加入以下部分:
[alias]co = checkoutci = commitst = statusbr = branchsh = stashsp = stash poppu = pushpr = pull -rrb = rebaselg = log -p
保存。
另外
总结的比较好的系统学习git的网站:https://git-scm.com/book/en/v2
网友评论