一 git和代码托管中心
代码托管中心的任务:维护远程库
局域网环境下:
外网环境
个人使用故事线
登陆github => fork操作 => pull命令 => 写代码 => add命令 => commit命令 => push命令 => pull request操作
团队协作故事线
团队写作项目 => 项目启动 => A开发者进入项目 => 团长接受A的PR => B开发者进入项目 => 团长接受B的PR => 分支管理 => 标签管理 => 查看历史
二 本地库操作
1. 本地库初始化
git init
2. 设置签名
形式:
命令
3. 查看状态
4. 添加到暂存区
5.从暂存区移除
6.从暂存区提交到本地仓库
- git commit
- git commit -m “hello world”
7.查看历史记录
- git log
- git log --pretty=oneline
- git log --oneline
- git reflog
8. 版本前进后退
- git reset --hard 索引值
- reset命令3个参数对比
- git reset --hard HEAD
9. 查看帮助
10. 删除文件
- 删除文件后,git add/rm <file>,git commit
- 删除文件后恢复, git reset --hard 删除前指针(只要提交到本地库就能恢复)
11. 比较文件差异
- git diff 文件名
- git diff 本地库中历史版本指针 文件名
- git diff
二 远程库操作
1. 查看远程库
2. 创建远程库别名
- git remote add origin https://github.com/fanjinyu1026/huanshan.git
3. push到远程仓库
4.从远程仓库clone
- git clone 远程仓库地址
- 完整的把远程库下载到本地
- 创建origin远程地址别名
- 初始化本地库
5.拉取
- pull = fetch+merge
- git fetch 远程库地址别名 远程分支名
- git merge 远程库地址别名/远程分支名
- git pull 远程库地址别名 远程分支名
6.解决冲突
- 要点
- 如果不是基于GitHub远程库的最新版所作的修改,不能推送,必须先拉取
- 拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可
7.fork:跨团队协作
- 以需要fork人的身份进入要fork的仓库地址,点击fork
- 本地修改,然后推送到远程
- Pull Request
- 被fork的人点击Pull Request,进行审查,没问题后,点击merge
- 将远程库拉取到本地
8.ssh密钥
- ssh-keygen -t rsa -C 邮箱地址
- cat ~./ssh/id_rsa.pub,将内容拷贝
- 右上角用户图标->Settings->SSH and GPG keys ->SSH Keys,将拷贝的内容粘进去 ->Add SSH Keys
- git remote add origin_ssh git@github.com:atguigu2018ybuq/huashan.git
9. commit chanlog
Commit message 和 Change log 编写指南 - 阮一峰的网络日志
10. 打tag
- git tag v0.0.1
- git push origin --tags
- 更新远程tag到本地
- git fetch origin --prune
- git fetch --tags
- 挪动tag
- git tag -d v1.0.1
- git tag v1.0.1
- git push origin --tags -f
11. .gitignore文件
新建一个.gitignore文件,google搜索一下语言相关的gitignore,如c gitignore,可以把个github仓库里gitignore文件内容复制过来
本地也有类似功能,只对本地生效。./git/info/exclude
12.
三 git学习资料
Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)
https://segmentfault.com/a/1190000023734704
四 遇到的具体问题
1)gitlab 发起merge request后,但还没有merge,发现代码有问题,怎么搞?
- 修改代码
- git add 修改的文件
- git commit --amend --no-edit
- git push origin basegw -f
注:
git commit --amend
会以新的改进后的提交来替换掉旧有的最后一次提交。只有一条commit记录,但commit id会变。- push的时候得加-f,要不可能会失败
参考:gitlab - How to commit new changes to an open merge request? - Stack Overflow
2) git pull后有冲突
error: Your local changes to the following files would be overwritten by merge
方法一:
- git stash save "save message"
- 可以多次
- 如果是新文件,需要git add 后,git stash -m
- git pull
- git stash pop
- 若有冲突,如:CONFLICT (add/add): Merge conflict in,解决冲突
- <<<<<<< Updated upstream到=======之间的代码是你拉取的别人的代码
- =======到>>>>>>> Stashed changes是你自己本次修改的代码
- sdfds
- git stash list 查看stash了哪些存储
- git stash show 显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
- git stash show -p 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -p
- git stash apply 应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1}
- git stash drop stash@{$num} 丢弃stash@{$num}存储,从列表中删除这个存储
- git stash clear 删除所有缓存的stash
另外,
常规 git stash 的一个限制是它会一下暂存所有的文件。有时,只备份某些文件更为方便,让另外一些与代码库保持一致。一个非常有用的技巧,用来备份部分文件:
- add 那些你不想备份的文件(例如: git add file1.js, file2.js)
- 调用 git stash –keep-index。只会备份那些没有被add的文件。
- 调用 git reset 取消已经add的文件的备份,继续自己的工作。
方法二
放弃本地修改,直接覆盖
- git reset --hard
- git pull
3) git add撤销
撤销工作区修改(还未git add)
git checkout file_name
撤销单个文件的add(工作区不动)
git reset HEAD file_name
撤销所有文件的add(工作区不动)
git reset HEAD
参考
How to fix Git Error 'Your local changes to the following files will be overwritten by merge' - Appuals.com
4)下载子模块
git submodule update --init --recursive
5)撤回远程的提交
回滚到上一个commit,命令强制提交到远程仓库
git reset --hard head^
git push origin master --force
6)git快照的理解
https://segmentfault.com/q/1010000008914409
参考
Git - Book