1、Linux基础指令
cd .. //返回上级目录
cd d: //进入d盘
ls -al //查看文件列表
cat dome.txt //查看文件
touch dome.txt //创建文件
rm dome.txt //删除文件
vim 文件名 //编辑文件
2、git的基本概念
Workspace:工作区
Index / Stage:暂存区(缓存区)
Repository:仓库区(或本地仓库)
Remote:远程仓库
2.1 git 初始化
git的初始化有两种,一种是还没有仓库自己新建,使用git init 初始化仓库;
一种是已经有仓库了,通过git clone 拉取仓库到本地。
git init //当前目录下初始一个仓库,多一个.git的隐藏文件夹
git config --global user.name 'lisan' //配置本地仓库用户名
git config --global user.email 'lisan@email.com' //配置本地仓库用户邮件
或者
git clone <path> //克隆gitcode
git remote add [shortname] [url] //添加远程库
例子:
克隆远程仓库
$ git clone git://github.com/schacon/grit.git
关联远程仓库
$ git remote add origin https://github.com/user/repo.git
补充:config的几种作用域
global 用户权限
system 系统权限
local 当前目录权限
2.2、git基础指令-添加、提交、查看、删除、回退
a、添加
基本操作略...
git add read.md //添加文件到缓存区
git add . //该目录下所有文件添加到缓存区
git add -a //项目内全部文件添加到缓存区
b、提交
基本操作略...
git commit -m "mrak" //提交本地仓库
git commit -am "mark" //提交本地仓库、与上面不同的是我们可以少了git add操作(只限于已经存在于缓存区的文件,也就是说如果你新建了个test文件,如果没git add,这里不会提交到仓库,还是老老实实add后commit。)
git commit --amend //修改最后一次提交commit的msg
c、查看
基本操作略...
git log -n 查看最近n次改动(常用)
git log --oneline //简洁记录
git log --graph //图形化显示commit
git log --reverse --oneline //反向查看记录
git log --oneline --graph //历史中出现了分支、合并
git status //查看文件状态(常用)
git status -s //查看状态 简洁模式
d、删除
基本操作略...
git checkout read.md //回复工作区文件内容到仓库最新版本的文件内容
git rm <file> //删除工作区内容
git rm <file> --cached //删除缓存区内容,工作区不受影响(比如.gitignore配置是我们可能会用到这个功能)
e、退回版本
开发中难免会提交错commit、因此git为我们提供了撤销commit的方法。
这里有个重点,没错就是HEAD,在使用git中我们常常会看到HEAD,那么HEAD到底是什么呢?我们知道在git中可能会有很多branch和commit,为了知道我们当前工作区提交到那个branch,所以需要个指针指向当前指向的branch的commit。HEAD可以简单理解成这个指针。(实际,HEAD指向的是当前分支,在每个分支上都有一个指针指向最新的commit,而HEAD始终是指向当前分支的指针,所以可以简单理解HEAD就是指针)
git reset HEAD read.md //撤销添加到缓存区的内容
git reset HEAD^ //回退一个commit
git reset HEAD~3 //向上回退3个commit
git reset commit_id //回退指定版本
git reset 841125 //回到commit_id=841125的提交
git reset 841125 和 git HEAD~3得到的结果是一样的
第一个方法让git回退到841125的commit 也就是倒数第三个commit;
第二个方法让指针(HEAD)回退3个节点(commit);
需要注意的是reset后面还可以跟 --hard、--mixed、--soft等参数
--mixed 影响仓库和暂存区 (reset HEAD and index)(默认值)
--soft 影响仓库 (reset only HEAD)
--hard 影响仓库、暂存区和工作区 (reset HEAD, index and working tree)
当我们git reset后不跟参数、默认是--mixed,也就是只对暂存区和仓库进行回退。
下面是最近三次的commit
commit 676249486735497db288f6654c7295d13125ec56 (HEAD -> master, origin/master, origin/HEAD)
最新commit
commit 2d751a62100e2f5af58d35923c84d6f8bc98cd0b
倒数第二commit
commit 841125dc92f4929fa0fe5622cff1f93af4bebf02
倒数第三commit
git revert
生成一个新的提交来撤销某次提交,此次提交之前的所有提交都会被保留。
$ git revert <commit ID>
f、撤销工作区中文件
撤销单个文件修改,使用下面命令:
$ git checkout -- 文件名
撤销所以文件修改,使用下面命令:
$ git checkout .
2.4 本地分支
a、 查看分支
略略略...
git branch //查看分支
git remote -vv //查看远程分支
git branch -a //查看本地和远程分支(所有分支)
git branch -vv //查看本地分支关联远程分支,及最近的一次提交
b、 创建、删除、切换
略略略...
git branch <分支name> //创建分支
git branch -d <分支name> //删除分支
git fetch -p //清理已经被删除的远程分支
git checkout <分支name> //切换分支
git checkout -b [分支名] [远程名]/[分支名] //切换并创建
3、 合并
每个需求新建一个分支开发,能很好的解决多个需求在一个分支里造成的混乱。
多人合作开发,创建分支开发真的是用了都说好。所以不可避免的我们需要合并自己的分支和同事的分支。
合并分支如果没有冲突,git里只是把指针指向了最新的commit。我们称之为fast-forward。
如果有冲突,这需要解决冲突,然后提交分支。
git merge <branch> //branch被合并到当前分支
git rebase master <branch> # 将master rebase到branch
merge和rebase都是合并分支,那么有什么区别呢?
主要区别在于,merge会保留分支的真实信息,而rebase会把分支上的commit融合到当前分支上。
直接放链接,解释的很清楚
开发一般都用merge,当然你非要用rebase合并分支也可以。
2.5、 远程分支
终于到最最重要的部分了,没有远程的git是么有灵魂的。
git pull # 抓取远程仓库所有分支更新并合并到本地
git pull --no-ff # 抓取远程仓库所有分支更新并合并到本地,不要快进合并
git fetch origin # 抓取远程仓库更新
git merge origin/master # 将远程主分支合并到本地当前分支
git push # 推送所有分支 (这个后面默认是 当前的分支对应的origin master)
git push origin master # 将本地主分支推到远程主分支
git push -u origin master # 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)
git push origin <local_branch> # 创建远程分支, origin是远程仓库名
git push origin <local_branch>:<remote_branch> # 创建远程分支
git push origin :<remote_branch> #先删除本地分支(git br -d <branch>),然后再push删除远程分支
git pull实际上有两个步骤,拉取远程仓库和合并拉取的内容,等同于,git fetch origin(拉取) + git merge brName(合并)
如果远程仓库创建了分支a,但是我们本地还没有分支a,所以我们先本地创建分支a,但是git push时你会发现,我们没有关联到远程分支无法推送,只是我么要用到git branch -u origin a这个方法本地分支a关联到远程分支a,之后我们就可以推送了。关联远程分支前别忘了先git pull,为啥?远程虽然新建了分支a,但是我们本地还不知道,所以需要git pull 获取远程的状态。可能有些乱,下面分解下1.git pull 获取远程信息 2. git checkout -b a 本地创建分支b 3. git branch -u origin a 关联远程分支a 4.git push 推送成功
一般情况下,我们提交到远程仓库,只需要git push即可,但是有时可能出现下面这种情况本地分支a关联的是远程分支b,虽然很很少见。这时如果在使用git push会推送失败,我需要完整的写出git push origin b进行推送。
4、 标签tag
用于对发布版本进行标记,这是最常见的应用场景。
git tag -a v1.0 添加标签
git checkout tagname 切换到 tag code
git log --oneline --decorate --graph 可以查看标签
5、查看文件diff
实际开发中,我基本没有用这个命令,还是在AS对比文件、解决冲突舒服。。。
git diff 比较工作区和暂存区的文件差异
git diff HEAD 比较工作区和仓库的文件差异
git diff --cached 比较仓库和暂存区之间的差异git diff <file> # 比较当前文件和暂存区文件差异
git diff --stat # 仅仅比较统计信息
git diff <branch1>..<branch2> # 在两个分支之间比较
git diff <id1><id2> # 比较两次提交之间的差异
5、保存到隐藏区(常用)
应用场景,假如在develop分支上我们正在开发分支,这是突然有个bug需要我们修复,但是我们又不能在develop分支上直接修改,这时需要我们切换到需要修复bug的那个分支上修复bug,假设这个分支是a。
git stash 保存当前修改到stash中
git stash save “message” 保存带msg的当前修改到stash中
git stash list 查看stash中存储的列表
git stash pop 从stash中提取出最新的保存到当前分支
git stash pop stash@{1} 从stash中提取标记为@{1}的修改到本地
git stash apply 回复工作区不删除stash内容,与pop不同的是不会删除stash区的内容
git stash drop stash@{0} 删除stash内容(通常和apply配合使用)
6、 其他
应用场景:分支b中的一个commit_id=5689k的commit,分支a中没有这个id为5689k的commit,如果分支a需要这个commit的内容,如果一个一个复制也不失是一种办法,但是这样实在是有些低效率,所以git为我们提供了快捷的方法。
git cherry-pick commit_id
在分支a上 git cherry-pick 5689k 即可把5689k的commit内容合并到a分支上路了。
git使用小技巧
$ git checkout - 快速切换到上一个分支
$ git config --global alias.co checkout //设置别名
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
开发中用的命令基本总结完了,可能会有遗漏想起里会补充的,有什么错误欢迎大家指出。(* ̄︶ ̄)