git是分布式的,不需要联网,每台电脑都是一个中央仓库
origin
是远程仓库的名字
开始
git init
在当前路径下创建git仓库
git add readme.txt
把文件修改添加到暂存区,使用命令git add <file>,注意,可反复多次使用,添加多个文件;
git commit -m "add project"
把暂存区里的所有修改保存到本地仓库
git status
查看当前的状态,哪个文件被修改了之类的. 查看的是提交之前,被修改的文件,或者没有add,没有commit的文件,只要commit之后,这里就看不到什么信息了
git diff readme.txt
具体查看这个文件怎么被修改了 diff也就是difference
注:
commit之前要先add.即便是之前已经add过了的也要在add一次.
如果修改了一个文件两次,只有第一次把修改add了,也就是放入暂存区了,那么commit的时候只会commit第一次的修改
关联远程仓库
git remote add origin git@github.com:mengao/learngit.git
把本地仓库和远程仓库关联起来,远程仓库名字:origin
修改远程仓库
git remote set-url origin [url]
git remote
显示远程仓库的名字
git push origin master/dev
//推送分支
git log
//查看当前,和之前的所有版本,也就是提交历史
回退版本
HEAD 表示当前的版本
git reset --hard HEAD^
//回退到上一个版本
git reset --hard HEAD~100
// 会退到之前100个版本
回退
git回退到旧版本后,再用git log 就不会显示新版本了.最新的就是当前的版本.如果知道最新的版本号,可以通过
git reset --hard 1093a
来指定回到未来的版本.版本号可以简写前几位,git会自动寻找.
如果找不到未来的版本id
git reflog
//记录了所有的每一次的命令.就可以从中寻找到commit id了,查看命令历史.
几个概念:
- 工作区:项目的目录
- 版本库:工作区里的一个.git的目录.
- 暂存区:HEAD和master分支
- 分支:git会自动为我们创建一个master的分支
每次add都会把修改放到暂存区.然后commit会把暂存区里的所有修改提交到分支上.
git checkout -- readme.txt
//回到最近一次commit或add时候的状态.
git reset HEAD readme.txt
//删除暂存区.但是文件里的修改并没有删除,需要再用checkout命令
git rm readme.txt
//删除某个文件
等价于:
rm readme.txt.
然后 git add/rd readme.txt
git push -u origin master
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
可以给一套代码设置两个远程库
git clone git@github.com:mengao/test.git
使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令
分支
0.查看分支
git log --graph --pretty=oneline --abbrev-commit
git log
git checkout -b dev
:首先,创建dev分支,然后切换到dev分支:
等价于以下两条命令:
git branch dev
git checkout dev
git branch
查看当前分支
git merge dev
合并指定分支到当前分支
git branch -d dev
删除分支
git log --graph
查看分支合并图
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
分支介绍:
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
创建新的bug分支进行修复,修复完之后合并,最后删除.
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定
如果从remote clone下来的项目,默认只有master分支,需要手动切换到dev分支
如果修改了一个文件,add之后没有commit,那么要切换分支的话是不可能的.就会要你commit或者存到stash里才可以.
冲突处理
1.一个人已经push了,另一个人push时候冲突的处理:
先push
git push origin dev
发生报错说远程仓库已经有人push且发生冲突了
那么pull
git pull
如果pull失败了,原因可能是没有指定本地dev分支与远程dev分支的连接.设置dev和origin/dev的链接
git branch --set-upstream-to=origin/dev dev
处理冲突的代码,然后:
git add ..
git commit ..
最后再次push
git push origin dev
stash
git stash list
//查看stash内容
git stash
//把当前的操作存储到stash里,后续可以恢复过来
git stash pop
//恢复stash内容的同时,删除stash
git stash apply stash@{0} //