一、将本地项目推送到远程github
1.在本地创建仓库
git init
2.将项目在本地提交
git add .
git commit
3.在github上创建仓库,本地添加remote地址
git remote add origin git_url
4.如果远程已经有提交了,比如readme,需要先将远程仓库pull到本地
git pull [远程仓库名] [远程分支名]
-
git pull origin master
- 第一次会让你登录github账户 - 报错
fatal: refusing to merge unrelated histories
- 原因是两个分别没有取得关联,无法merge
- 解决办法,加上--allow-unrelated-histories
,忽略不关联
5.将本地提交推送到远程仓库
git push -u [远程仓库名] [本地分支名]
-
git push -u origin master
- 第一次加上-u
,之后就不需要-u
了
二、分支管理
1.查看已有分支(本地+远程)
-
git branch
查看本地分支,标*号为当前分支 -
git branch -a
查看本地+远程分支
2.新建分支(本地+远程)
1. 新建一个本地分支
git branch new_name
- 将会以当前分支为基础创建新分支
-
git checkout -b [分支名]
:创建并切换到新分支
2.新建一个远程分支
push 一个本地新分支到远程
- 先在本地建立一个分支:
git branch branch_name
- 先在本地建立一个分支:
- 切换到该新分支:
git checkout branch_name
- 切换到该新分支:
- 将这个本地分支推动到远程仓库以新建一个分支:
git push [远程仓库名origin] [本地分支名]:[远程分支名]
- 将这个本地分支推动到远程仓库以新建一个分支:
- 直接创建远程分支:
git checkout -b [分支名] [远程仓库名]/[分支名]
3.切换分支
1.切换本地分支:
git checkout branch_name
2.切换远程分支:
- 呵呵,不存在的
4.分支合并
1.将指定分支合并到当前分支
git merge [指定分支名]
- 默认采用的是Fast-forward(快进模式)合并方式,直接将当前分支指向了指定分支的最新提交,会有环出现,切不会产生新的提交。虽然速度快,带来的问题是这样当某个分支被删除了,该分支上的log将也没了。
--no-ff
禁用快进模式,那么每次merge都将是一个指定分支向当前分支的新的提交。删除分支之后,同样会造成log丢失。
2.解决merge冲突
-
git status
查看冲突的文件,并解决冲突 -
git add .
再次提交工作区文件 -
git commit
再次提交,完成合并 - 可选,删除分支
3.git rebase
把分叉的提交历史“整理”成一条直线,看上去更直观
其实是在当前分支上对其他分支依次执行git cherry-pick
,最后得到的log就是一条线上的
5.删除分支
1.删除本地分支
git branch -d [分支名]
2.删除远程分支:
push 一个空分支
- 可以push一个空分支来删除远程分支:
git push [远程仓库名 origin] :[删除的远程分支名]
- 也有专门的命令:
git push [远程仓库名 origin] --delete [删除的远程分支名]
三、本地版本穿梭
1.工作区和版本库
- 工作区:可见的文件夹目录
- 版本库(repository): .git 隐藏文件夹
- 暂存区(stage) + 版本库 -
git checkout --[filename]
:撤销工作区的更改
- 加--
是为了区分切换分支 -
git status
:查看暂存区内容 -
git add
:添加工作区更改到暂存区
- 添加文件或者删除文件不需要添加到暂存区,直接commit就可以了 -
git reset [filename]
:撤销(unstage)暂存区的更改到工作区 -
git commit
:提交暂存区的内容到版本库
---amend
,在上次提交的基础上再次提交
2.版本回退
-
git reset --hard [commit_id]
- 通过git log
和git reflog (查看命令历史)
查看commit id
--- hard
的作用是: -
git reset --hard HEAD^
-HEAD
表示当前版本,HEAD^
:上一个版本
---hard
:表示的是彻底回退,而不是将提交回撤到暂存区或者工作区,工作区和暂存区的变化将为空。
四、远程仓库
0.上传SSH key
用ssh key来区别是否是本人操作,未上传ssh, 无法push
1. 生成SSH key
$ ssh-keygen -t rsa -C "youremail@example.com"
2. 查看主目录.ssh
,找到密钥
-
id_rsa
和id_rsa.pub
3. 将公钥上传
- 之后就可以进行push操作了
1.本地与远程操作
1. 将远程仓库和本地仓库关联(添加远程仓库):
-
git clone [git仓库url]
的情况下直接关联,不需要再添加
Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin
并且只会clone远程的master分支到本地 - 其他情况
-git remote add [仓库名] [git仓库url]
-git remote rm [仓库名]
2. 查看远程仓库名
git remote
- 一般默认为:
origin
3.将本地分支与远程分支建立连接
git branch --set-upstream-to= [远程仓库名]/[远程分支名] [本地分支名]
- 这是进行
git push
和git pull
前提,否则需要参数指定 - 设置好了之后,直接
git push
,git pull
就可以,无需参数
4. 拉取远程内容
git pull [远程仓库名] [远程分支名]
4. 推送本地分支到远程分支
-
git push -u [远程仓库名] [本地分支名]
: 推送本地当前分支到远程分支 -
-u
参数只需要第一次加,意思是将本地分支与远程分支关联了,相当于--set-upstream-to=origin/branch
的作用