Git的使用命令
将已有的代码目录作为仓库新增到git中:
进入到代码目录中
git init
git add README.md (如果需要才进行该命令)
git commit -m "first commit" (如果上一个命令执行了才进行该命令)
git remote add origin 你的git仓库地址(ssh或者https格式都可以,如果没有该新仓库,则需要手动先新建)
git add .
git commit -m '新增代码'
git push -u origin master
检出远端到本地:
git clone https://github.com/wsluozefeng/git_test.git
查看当前git情况:
git status
创建分支:
git branch 分支名:创建“本地分支”
git checkout 分支名: 切换分支
git checkout -b 分支名: 新建“本地分支”并且切换,等效上面2句命令
查看分支:
git branch: 查看“本地”分支情况
git branch -r: 查看“远端”分支情况
git branch -a:查看远端和本地的所有分支
重命名分支:
git branch -m | -M oldbranch newbranch (如果newbranch名字分支已经存在,则需要使用-M强制重命名,否则,使用-m进行重命名。)
删除本地分支:
git branch -d | -D 分支名称:删除和强制删除“本地分支”
删除远端分支2个步骤:
git branch -d -r origin/分支名 :只是删除的本地对该远程分支的track,并非真正删除,虽然使用git branch -r 查看不到该分支
git push origin :分支名:通过push一个空分支,表示真正删除该分支
基于某分支创建本地新分支,且推送到远端,例如基于master创建新分支new_branch
1. 进入master分支: git chekcout master
2. 创建分支: git branch new_branch_name
3. 前面可以做任何操作,比如新增文件,修改文件等等,git commit之后,最后一个就是将分支新建到远端版本中去: git push origin 分支名
本地拉取远端分支:
假设远端分支是:order-gift,本地如何拉取order-gift分支
1. git fetch origin :拉取远端主机最新的代码,在本地主机上要用”远程主机名/分支名”的形式读取,例如origin/order-gift
2. git checkout -b my_local_order-gift(本地分支名称) origin/order-gift(本地的远端分支)
提交操作:
1. git add: 新增文件到“索引文件中”,文件带路径,如果是新增的文件需要先git add,更新的文件如果不使用该操作,需要在git commit 中添加-a的参数
2. git commit -a:提交当前的所有改动 到“本地版本库”,如果新增和修改的文件都通过git add操作过,-a参数可去除
3. 弹出记录日志的操作,使用编辑模式进入写入日志后保存离开即可
4. 在git push之前需要拉取当前分支的最新代码,并且合并,如果有冲突且处理冲突, 如果没有任何新代码就不需以下操作
git fetch origin : 拉取origin下的所有分支的最新修改的代码提交到本地,显示结果中,也可通过commit_id查看日志,如下图
git diff my_local_order-gift(本地分支名称) origin/order-gift(远端分支全路径): 查看本地版本库与远端版本库的差别
git merge origin/order-gift :合并本地版本库和远端版本库的代码,有冲突得解决冲突,如果存在本地未commit的修改,需要先commit或者git stash暂存起来,否则无法合并
git diff HEAD: 比较工作目录 与 本地版本库 的区别 看是否有问题, 由于git merge的操作,本地版本库已经与远端版本库一致了
5. 合并后再一次提交代码到本地版本库: git commit -a
6. git push origin 远端分支: 提交的远端服务器版本库, origin表示的是git服务器的远程主机,远端分支必须是全路径
ps:在每次本地工作完成后,都会做一个git commit 操作来保存当前工作到本地版本库, 此时会产生一个commit-id,这是一个能唯一标识一个版本的序列号。 在使用git push后,这个序列号还会同步到远程版本库。
查看当前分支的日志(如果没有合并该分支最新的代码,那么看到的将不会包含新代码中的日志记录,所以在必须先确保当前分支是最新代码,如果不是最新代码可通过 git fetch 拉取最新代码):
git log
git show 5aa1be6674ecf6c36a579521708bf6e5efb6795f(日志sha) 路径+文件名
git log --pretty=oneline 将日志精简显示成一行
查看当前分支的某个文件的日志
git log 路径+文件名
git show 5aa1be6674ecf6c36a579521708bf6e5efb6795f(日志sha) 路径+文件名
git log --pretty=oneline 路径+文件名
查看远端某个分支的日志(如果不是最新代码,需要通过git fetch拉取)
git log origin/order-gift
git log origin/order-gift -2 查看远端order-gift分支的最后3个日志
查看命令历史:git reflog
文件比对:
git diff: 是查看 工作目录 与 索引文件 的差别的。
git diff --cached:是查看 索引文件 与 本地版本库 的差别的。
git diff HEAD: 是查看 工作目录 和 本地版本库 的差别的。(HEAD代表的是最近的一次commit的信息)
git diff HEAD -- readme.txt : 查看工作区和版本库里面最新版本的区别。
修改暂存:
假设您正在为您的产品实施的一项新功能。你的代码是在推进开发进度而客户不断升级需求突然来了。正因为如此,你必须保持放下你的新功能,工作几个小时。你不能提交你的部分代码,也不能扔掉你的变化。所以,你需要一些临时空间,在那里你可以存储你的部分修改,以便以后再提交
git stash: 将当前工作目录的改变都保存在堆栈了,现在可以对该目录进行别的开发操作
git stash list:查看当前工作目录的堆栈情况
git stash pop: 将保存在暂存堆栈的第一个(stash@{0})修改删除,并且还原到“当前目录”中,必须是在该代码所属修改的分支中去操作,如果存在冲突就解决冲突,如果暂存堆栈中有多个修改,可以使用git stash pop stash@{num},num 就是你要恢复的工作现场的编号,通过git stash list 可查看,使用git stash apply stash@{num}方法 除了不在stash队列删除外其他和git stash pop 完全一样
分支合并:(建议使用变基的方式,变基相关:https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%8F%98%E5%9F%BA)
将分支order-gift合并到master
1. git checkout master
2. git pull 或者 git fetch origin + git merge origin/master :保证master分支是最新代码
3. git checkout order-gift
4. git rebase master :将order-gift的修改变基到master中去
5. git checkout master
6. git merge order-gift :合并
7. git commit
8. git push origin master
ps:
变基(rebase)原理:
这rebase命令会把你的"order-gift"分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),
然后把"order-gift"分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到"order-gif"分支上。
变基冲突解决:
在rebase的过程中,也许会出现冲突(conflict). 在这种情况,Git会停止rebase并会让你去解决冲突,此时代码处于 (no branch)状态, 通过git branch可查看;
在解决完冲突后,用"git add ."命令去更新这些内容的索引(index), 然后,你无需执行 git commit,只要执行:
$ git rebase --continue
这样git会继续应用(apply)余下的补丁。
在任何时候,你可以用--abort参数来终止rebase的行动,并且"order-gift" 分支会回到rebase开始前的状态。
$ git rebase --abort
针对工作目录的撤销:
git reset --hard HEAD : 丢弃工作目录的所有修改(没有commit前的),并且代码还原为当前最新commit的
git reset --hard HEAD~1 : 将工作目录的代码还原到上一个commit
git reset --hard commit_id : 将工作目录的代码还原到commit_id对应的
git reset --hard origin/分支 :
针对暂存目录的撤销
git reset HEAD (文件) :将暂存区中的修改还原到当前的commit,也就是取消最近的而一次git add 操作,也可以单个文件操作
针对某个文件的版本回滚(commit_id:XXX1, 文件:a.php)
方法1:
git reset XXX1 a.php : 将代码回滚
git commit -a -m 'a.php文件回滚到版本XXX1' :提交到本地仓库
git checkout -- a.php :将文件还原到xxx1版本
git push
方法2:
git checkout XXX1 a.php
丢弃工作区修改的命令:git checkout -- file
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
注意:git checkout -- file命令中的--很重要,没有--,就变成了“创建一个新分支”的命令
列出所有远程主机:git remote
查看远程主机的网址:git remote -v
查看该主机的具体情况:git remote show 主机名
删除文件:git rm 文件1 文件2 ..... 之后也需要git commit 和git push操作
删除目录:git rm -r 文件夹 之后也需要git commit 和git push操作
移动目录或文件:git mv 旧路径(+文件名) 新路径 之后也需要git commit 和git push操作
增加.gitignore文件来忽略某些文件,该文件需要建立在与.git目录同级下
.gitignore文件中的写法:
index.php #忽略 当前目录下的index.php文件
/public #忽略 当前目录下的public目录及其里面的所有内容
这里能够直接忽略的是没有被跟踪的文件,如果需要忽略已经被跟踪的文件,需要先执行一下命令后,在再.gitignore文件中添加该文件名
git update-index --assume-unchanged 文件名
如果需要放弃该忽略,执行下面命令:
git update-index --no-assume-unchanged 文件名
ps:这种已被跟踪的文件忽略,即使其他人修改了该文件后提交,你在自己的git中更新代码,是不会发生冲突现象,因为他会直接覆盖该文件