什么是git?怎么来的? 不再赘述,直入正题!
git分区
- 工作区(working)
编辑区,直接操作 - 暂存区(stage)
暂时存放的区域 - 版本库(loacl repository)
已经提交数据 - 远程库(remote repository)
可push到远程库
clone项目
git clone [HTTPS|SSH] [directoryName]
HTTPS:使用HTTPS都可以clone项目,但是push需要验证用户名和密码;
SSH:clone项目必须是拥有者或者管理员,需要添加SSH Key。push时,不需要验证,如果配置SSH key时设置了密码,则需要输入密码的,否则不需要输入密码。
创建SSH Key
每次都输入账号密码验证?
明文配置username:password@github.com?
配置一下SSH key吧!
$ ssh-keygen -t rsa -C "user@gmail.com"
成功后ssh key位置:
window在c盘的当前用户找到.ssh文件夹下的id_rsa.pub文件用记事本就可以打开,另一个是私钥
mac在home目录: 命令行 cat ~/.ssh/id_rsa.pub
添加公钥到git
登录github > 头像 > settings > SSH and GPG keys > new ssh key
id_rsa.pub的内容都复制到key > 保存
基本配置
$ git config --global user.name "name"
$ git config --global user.email "you@email.com"
查看git配置
$ git config --list
初始化
先有本地库,再创建远程仓库
$ git init
本地库链接远程库
$ git remote add origin https://github.com/repositories.git
$ git push -u origin master
注意:第一次push的时候,加上-u参数,Git就会把本地的master分支和远程的master分支进行关联起来,我们以后的push操作就不再需要加上-u参数了
查看/修改远程库
查看
$ git remote -v
修改远程库 1.直接修改
$ git remote set-url origin [url]
2.先删除,再添加
$ git remote rm origin
$ git remote add origin [url]
提交
工作区提交到暂存区
$ git add [文件名]
$ git add . 提交所有
工作区提交到版本库
$ git commit -a -m "msg"
提交暂存区到版本库
$ git commit -m "msg"
版本库提交远程库
当前分支
$ git push
指定分支
$ git push origin branchName
查看各区不同之处
查看各个区域状态添加、删除、修改、冲突、待push...
$ git status
查看工作区和暂存区的区别
$ git diff [README.md]
查看工作区和版本库的区别,还有版本库和版本库(哈哈哈)
$ git diff HEAD 上次提交
$ git diff commitID 某次提交commitID
$ git diff branchName 分支
$ git diff commitID commitID 两次commitID区别
$ git diff HEAD -- [fileName|filePath] 上次提交和文件或路径
git diff 本地分支名 origin/分支名 本地分支和远程分支
暂存区和版本库区别
$ git diff --[cached|staged]
查看日志
查看本次命令行窗口的日志
$ git log
$ git log --pretty=oneline 一行显示
查看所有历史日志
$ git reflog
回退
工作区回退
git status也清空
$ git reset --hard 上传编号 恢复到commitID
$ git reset --hard HEAD^ ^上一次远程库提交(push);不是commit HEAD~10 10次够不够? 不够? 再来10次
$ git reset --hard HEAD@{0} git reflog查看时的{0}
// 以上是对本地的回滚,需要将本地回滚,强制将master分支同步到远程仓库
$ git push origin [分支名] --force
工作区回退到上一次
$ git checkout -- README.md 一定要有-- ,没有--是切换到另一分支
两种结果:
- README.md已经提交的版本库修改后,还没有被放到暂存区;现在,撤销修改就回到和版本库的状态。
- README.md已经添加到暂存区后,又修改了;现在,撤销修改就回到添加到暂存区后的状态。
暂存区撤回工作区
$ git reset HEAD README.md // 不会清除status,确定从暂存区退回可直接使用git $ checkout -- README.md
$ git status
$ git git checkout -- README.md
版本库撤回到暂存区
$ git commit -m 'msg' --amend
撤回上次提交的日志和提交到master的内容到stage,然后再次把stage提a交到master。
删除
$ git rm 文件名
删除文件需本地和master的内容一样,否则不能直接删除,需要先使用rm 文件名,然后使用命令git commit -m "msg"完成本地和master的删除。
分支
查看分支
本地分支
$ git branch
远程分支
$ git branch -r
本地和远程分支
$ git branch -a
创建分支
$ git branch 分支名
切换并创建
$ git checkout -b 分支名
拉取远程分支并创建本地分支
git checkout -b 本地分支名 origin/远程分支名
更新原创分支 如果你的remote branch不是在origin下,按你得把origin换成你的名字。
git remote update origin --prune
本地分支与远程分支的映射关系
git branch -vv
重命名分支
$ git branch -m branchName newName
切换分支
$ git checkout 分支名
手动建立本地分支和远程分支的映射
git branch -u origin/分支名
git branch --set-upstream-to origin/分支名
撤销本地分支与远程分支的映射
git branch --unset-upstream
删除本地分支
$ git branch -D branchName D不管提交还是没有提交都能删
$ git branch -d branchName d只有不提交才删除
删除远程库分支
$ git push origin --delete branchName
提交分支到远程库
$ git push -u origin branchName
如果分支名存在直接提交,不存在会自动创建分支名
合并分支
不可查合并分支
$ git merge branchName
a向b合并,在b上执行此命令(使用快速合并)合并分支时当文件有冲突是不能进行合并需要手动进行调整。如果解决文件中冲突的的部分,然后add->commmit->push。
可查合并分支
git merge --no-ff -m "msg" branchName
合并分支之后,使用git log --graph 删除分支仍可查看合并的记录,-m "merge with no-ff" 当被合并的分支有提交到版本库的文件时,做的提交描述。
合并查看
git branch --merged 合并过得分支
git branch --no-merged 没有合并过的分支
分支log
git log --graph --pretty=oneline --abbrev-commit
冲突处理
当多人协作时,如果远程库被其他人员修改并已经推送。此时在push时会提示冲突,大概意思是,另一个存储库推送了一个最新的文件,要先解决冲突在推送。
简述下原因,知其然知其所以然!
首先orign/mastter中的commitID=0,本地仓库master分支commitID=0。
远程仓库有人员更新远程仓库库中master分支上,新的代码版本号commitID=1 ,此时远程仓库 orign/master的commitID=1。
本地仓库代码修改commit后,commitID=2。
需要本地和远程仓库的commitID为一致。解决冲突,产生新的commitID,然后push远程库;
解决方案:
- fetch取回远程库的commitID=1,手动merge到本地库的分支;
- stash隐藏本地仓库的改变,git pull后,释放隐藏区(适用还在工作区);
- git pull把本地和远程仓库的commitID全部更改为一致;
1.fetch
1.1 取回分支
取回全部
git fetch --all
取回指定分支
git fetch origin branchName
取回并创建新的分支
git fetch origin branchName:newBranchName
取回的更新,在本地上要用'远程库/分支名'的形式访问。比如origin的master分支,就要是用用origin/master访问
查看远程分支
git branch -r
手动查看冲突项
git diff 本地分支名 origin/branchName
1.2 手动合并
git merge origin/分支名 // 远程库的分支,合并到当前本地所在分支
1.3 git status 查看是否有冲突
解决文件,然后add->commmit->push
2.使用stash隐藏工作区
2.1 将本地修改存储起来
$ git stash
本地的所有修改被暂时存储起来。
$ git stash list 可以查看stash记录
$ git stash show -p stash@{0} 暂存时git库的区别
暂存了本地修改之后,就可以pull了。
2.2 pull
$ git pull
2.3 还原隐藏的工作区
$ git stash pop [index] // 默认0
系统提示如下类似的信息:
Auto-merging c/environ.c
CONFLICT (content): Merge conflict in c/environ.c
意思就是系统自动合并修改的内容,但是其中有冲突,需要解决其中的冲突。
2.4 git status 查看是否有冲突 解决文件,然后add->commmit->push
删除stash
git stash drop <stash@{id}>
如果不加stash编号,默认的就是删除最新的,也就是编号为0的那个,加编号就是删除指定编号的stash。
清除所有stash
git stash clear
git stash pop和git stash apply <stash@{id}>
git stash pop stash@{id}命令会在执行后将对应的stash id 从stash list里删除;
git stash apply stash@{id} 命令则会继续保存stash id。
3.pull
可能会有如下问题:
2.1 当前分支没有跟踪信息
指定要拉取的分支
git pull <origin> <branch_name>
指定跟踪的分支
git branch --set-upstream-to=origin/<branchName>
2.2 合并分支的时候遇到冲突
1.按键盘字母 i 进入insert模式;
2.修改最上面那行黄色合并信息,可以不修改;
3.按"Esc"键;
4.输入":wq",注意是冒号+wq,按回车键即可;
2.3 git status 查看是否有冲突
解决文件,然后add->commmit->push
忽略文件跟踪
git工作区根目录下创建.gitignore文件,把要忽略的文件名/文件夹填进去,git自动忽略文件跟踪。 格式如下:
package-lock.json
node_modules/
把某些文件夹或文件加入忽略规则,发现并未生效,因为.gitignore只能忽略没有被追踪的文件,如果文件已经被记录了版本管理,则修改.gitignore是无效的。
解决方案先把本地缓存删除(改变成未被追踪状态),然后再提交,就不会出现忽略的文件了。
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
配置命令别名
如下格式:
$ git config --global alias.cm commit
$ git config --global alias.co checkout
$ git config --global alias.branches 'branch -a'
恢复命令别名
当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:
别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。
配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。
tag
查看
$ git tag
创建标签
$ git tag v1.0
指定commitID创建标签
$ git tag v0.9 6224937(commitID)
删除标签
$ git tag -d v0.9
查看标签信息
$ git show <tagname>
推送到远程仓库
git push origin v1.0
参与开源项目?
访问项目主页,点'Fork'克隆此仓库到自己的账号下,然后一定要从自己的账号下clone仓库,才能推送修改。
如果从源项目主页克隆,因为没有权限,不能推送修改。
如果你想修复bug或新增功能,开发完成后仓库推送到自己的仓库。
如果你希望源仓库能接受修改,可以在GitHub上发起一个pull request。源仓库是否接受pull request就不一定了。
源仓库有权限的用户查看提交的request进行回复或者同意合并。
Scott Chacon和Ben Straub 撰写pro git