git操作
git基本原理:
git有两个最重要概念:远程分支和本地分支,远程分支通过push命令提交,本地分支通过commit命令提交。想要更新远程分支,需要首先将改动commit到本地分支(如果没有其他分支就是master),然后push到远程分支。一个git项目中的文件有四个区:修改过暂存(stage)的文件区,修改过未暂存的文件区,git未跟踪的文件区,未修改过的文件区。通过add命令将修改过未暂存的文件加入暂存区,这时文件就进入了版本库,再通过commit命令可以将暂存区的文件提交到本地分支,然后通过push命令把这些文件修改更新到远程分支。
本地版本库提交流程图:
一些名词解释:
master
:第一次初始化git仓库时默认的第一个分支,也是当前的主分支 head
:指向最新commit的指针
####基本配置
* ssh配置
* 创建ssh
windows中,ssh文件默认在C:\Users\1069\.ssh下。如果没有**id_rsa和公钥 id_rsa.pub,需要手动创建: ssh-****** -t rsa -C "[email protected]"
ssh公钥要和仓库的公钥一致才能使用ssh clone。
* 设置用户名和密码 git config --global user.name "你的github用户名"
git config --global user.email "你的邮箱地址"
1.本地git操作(下面的操作都是在本地的操作,改变的是本地仓库,和远程仓库无关)
首先cd path
进入git仓库所在目录
- 查看git目前状态:
git status
这个命令会显示三部分的内容:- 暂存的文件区(修改后的文件等待commit)
- 未暂存的文件区(修改后未使用add命令加入暂存区)
- git未跟踪的文件区(git不会跟踪该文件区的变化)
- 显示文件的变化
git diff filename
git diff head -- fileanme
(查看工作区和版本库(head指向最新commit)的文件差别)
· 将文件加入暂存区:
git add filepath
添加多个文件时,文件之间用空格隔开提交到本地仓库
git commit -m “commit message”
提交后有修改再次提交(如往暂存区又添加了一个文件):git add forgotten_file
git commit --amend
(会和前一个commit合并成一个commit)查看本地commit历史
git log
(--pretty=oneline
可以只显示commit id和message)回退到以前(未来)的版本(版本就是每次commit的内容)
git reset --hard head
(最新的commit是head)git reset --hard commit-id
返回到指定commit-id的commit(commit-id只需写前几位,git会自动识别,当然也不能写太短,因为容易有多个相同id前缀)
如果又想回去,只要前面的commit-id还能显示,就能再次调用这个命令回到‘‘未来’’
当然,如果找不到想回退的commit-id,也有命令可以显示你所有的commit和reset操作:git reflog
,这样就可以找到你想会退的commit-id了。
reset到一个commit后,这个commit以后的所有修改都会以not staged的形式存在。取消暂存的文件(放入未暂存的文件区)
git reset head <filepath>
所以,reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。-
撤销文件的修改(把工作区文件与版本库同步)
git checkout -- filepath
有两种情况:- 已经commit,则返回到最近的commit时文件的状态
- 没有commit,但已经add进暂存区,则返回到add到暂存区时文件的状态。
总之,checkout
返回这个文件最近一次commit
或add
时的状态- 场景1:当你想丢弃目前工作区的修改时,直接
git checkout -- filename
即可。 - 场景2:当你已经把工作区的内容add到暂存区,那么要使用
git reset head filename
就返回到了场景1,然后再按场景1处理。 - 场景3: 当你已经把工作区的内容add到暂存区,并且commit到了本地分支,那么就需要使用
git reset commit-id
回退版本,然后再按场景1处理 - 上述场景都是在你没有push到远程仓库的前提下进行的
注意:参数中--
很重要,不加的话就成了切换到另一个分支。
- 场景1:当你想丢弃目前工作区的修改时,直接
git stash
当你正在完成一项工作A,而此时有一项bugB需赶紧修改并提交,而提交就可能把A也提交,而你还没有完成A,这时你可以先git stash save "mess"
保存当前工作区状态,这样之后工作区就回到了最近一次commit后的状态。stash命令会把工作区压进一个栈里,可以多次运行stash命令。当你完成B,push到远程后,使用git stash pop
返回最近的一次保存状态(注意这时也有可能会冲突)。git stash pop [email protected]{id}
返回到指定id的stash状态。
注意:pop后会删除当前状态。git stash list
可以查看当前栈中的所有保存状态。git stash drop [stash_id]
删除指定id的栈中状态
2. 和远程仓库交互
- 本地仓库和远程仓库关联
- 先有本地库
假设我们本地仓库已经写好,想推送到github:
首先应把本地仓库初始化为一个git仓库:mkdir git_test
(如果已经创建则跳过此步)cd git_test
git init
(初始化成git仓库)
然后在github创建一个新仓库
最后,本地仓库关联远程仓库git remote add origin https://github.com/bobobe/test.git
(origin这时就是远程仓库的名字,这是默认的叫法,也可以换成其他名字) - 先有远程库
直接clone即可git clone origin_name.git "my_path"
- 先有本地库
提交到远程仓库(待完善)
git push <远程主机名> <本地分支名> <远程分支名>
例如git push origin master:refs/for/master
,即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名
常用:git push origin master
(git push -u origin master
)从远程仓库拉取最新内容
git pull
有时你push到远程仓库时会失败,提示信息为你本地仓库版本落后于远程仓库版本,即其他人又提交了代码,需要先拉取远程仓库。如果拉取后和你本地仓库没有冲突,则合并成功,你只需再次push即可。这种情况常见于你和其他人修改的不是同一个文件。
但大多数情况下都会产生冲突,这时就需要解决冲突。冲突发生后,在冲突的文件里git会标注冲突的内容:<<<<<<< HEAD
ttt
=======
eee
左箭头到等号之间的内容是你本地仓库的内容,等号后面的为远程仓库的内容。
解决完冲突后,把这些标识符都去掉。然后再次add,commit,push即可。
3.github操作
- fork