git的使用
创建git库
初始化git
1 | mkdir gittest |
将要添加的文件加入git管理
add 从工作区到暂存区
1 | git add [filename] |
或者将目录下所有文件都加入
1 | git add . |
自定义所要添加的文件
总是手动add每一个太麻烦了,但总有些不希望添加进去的,可以这样。
- 创建一个文件名为的文件
.gitignore
- 文件内容为
1
2
3
4file
.*
!.gitignore
!file1 - 这表示名为file的文件要加进去
- 所有文件都要加进去
- 忽略 .gitignore
- 忽略 file1
提交到仓库
commit 将暂存区提交到仓库
1 | git commit -m |
每次commit之前都要add所要进行管理的文件
查看仓库状态
1 | git status |
查看文件更改情况
1 | git diff |
版本管理
版本回退
在commit之后后悔了
1 | git log |
使用git log 查看之前提交的记录,记下回退的版本号commit id 输入
1
git reset --hard [commit id]
注意只有在head指向的版本之前的, 切换版本到当前版本之后的 输入
1
git reflog
撤销修改
丢弃对工作区的修改 add之前
1
git checkout -- [filename]
checkout就是用版本库里的版本替换工作区的版本*
丢弃对暂存区的修改 add之后 commit之前
1
git HEAD [ ]
远程仓库
创建ssh key
1
ssh-keygen -t rsa -C "myemail@163.com"
在用户目录里找到id_rsa.pub,将里面的数据复制到GitHub中,这样就可以从本地电脑推送到GitHub中了.
添加远程库
1
2git remote add repo1 git@github.com:yishuilingbo/gittest.git
查看本地所有仓库
1
git remote -v
推送到远程库
1
git push -u [库名] [分支名]
加上了-u参数,Git不但会把本地的分支内容推送的远程新的分支,还会把本地的分支和远程的分支关联起来,在以后的推送或者拉取时就可以简化命令。
删除远程库
1
git remote rm
克隆库
1
2git clone git@github.com:yishuilingbo/gittest.git
cd [库名]
分支管理
建立新的分支
1 | git branch [branchname] |
查看所有分支
1 | git branch |
切换分支
1 | git switch branch [branchname] |
创建并切换分支
1 | git switch -c [branchname] |
合并分支到当前分支
1 | git merge |
删除分支
1 | git branch -d |
- 若该分支没有被合并过,以下强制删除
1
git branch -D
合并冲突
- 当两个不同的分支对同一对象进行修改并提交之后会发生 merge conflict
此时需要查看冲突文件手动解决冲突。查看分支合并图
简洁版1
git log --graph
1
git log --graph --pretty=oneline --abbrev-commit
分支管理策略
通常合并分支的时候,git会采用fast forward模式。这种模式下,git只是把分支指针向前移动,此时,删除掉分支之后将会丢失分支信息。若要强制禁止fast forward,git就会在merge的时候生成一个新的commit,这样即使删除该分支,也可以从log上查看历史信息。 - 强制禁止fast forward
1
git merge --no-ff -m [commit 描述] [来源分支名]
修复main分支上的bug流程
- 当前在dev分支,先保存工作现场
1
git stash
- 切换到main分支,并建立新的分支bugfix
- 在新的分支上修改bug,然后提交后合并到main 产生一个commit id fixbug
- 回到dev分支,回复现场
1
2
3
4git stash pop //这将删除这条stash
或者
git stash list //查看stash list
git stash apply stash@{0} - 将修复的信息复制到当前dev分支
1
git cherry-pick
多人合作冲突
- pull 下来之后手动解决冲突在再合并push
标签
创建标签
- 切换到要创建标签的分支上默认标签打在最新的commit上面
1
git tag [标签名]
- 对历史commit打标签
1
2git log --pretty=oneline --abbrev-commit //列出历史commit
git tag [tag] [commit id] - 指定标签信息
1
git tag -a [tag] -m [info] [commit id]
标签总是和对应的commit挂钩
删除标签
1 | git tag -d [tag] |
标签只存储到本地,不会自动推送到远程,可以这样推送到远程
1 | git push [库名] [tag] |
删除远程标签
1 | git push [库名] :ref/tags/[tag] |
git报错
refusing to merge unrelated histories
描述
- 首先再github上创建一个仓库
- 在本地初始化一个仓库。
- 添加远程仓库
- git push -u ge main
- 报错为
$ git push -u ge main
To github.com:yishuilingbo/XYY-Game-Engine.git
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs to ‘github.com:yishuilingbo/XYY-Game-Engine.git’
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: ‘git pull …’) before pushing again.
原因
- 本地仓库和远程仓库实际上是独立的两个仓库。假如之前是直接clone的方式在本地建立起远程github仓库的克隆本地仓库就不会有这问题了。
解决
1
2$git pull [库名] [分支名] --allow-unrelated-histories
接着解决冲突然后 push即可
多仓库 multiple ssh keys on one computer
步骤
- 生成ssh key ,并给生成的文件使用绝对路径特定地命名。
- 在 .ssh 目录下新建config文件,内容为
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#gittest
Host gittest.github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_gittest
IdentitiesOnly yes
#coebase
Host codebase.github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_codebase
IdentitiesOnly yes
#coebases
Host blog.github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_codebase
IdentitiesOnly yes - 修改本地仓库地config中的url
eg:
gittest地config本来为修改为:1
2
3[remote "origin"]
url = git@github.com:yishuilingbo/gittest.git
fetch = +refs/heads/*:refs/remotes/origin/*即添加上gittest.1
2
3[remote "origin"]
url = git@gittest.github.com:yishuilingbo/gittest.git
fetch = +refs/heads/*:refs/remotes/origin/* - 在GitHub上的仓库中添加刚刚生成的deploy key
原理
- 即对于不同的仓库使用不同的key,并且使用别名来区分不同的仓库。
参考
- https://gist.github.com/jexchan/2351996
agent
1 | exec ssh-agent bash |
多账户
自己只需要本地保存自己账户的ssh key即可,按照这里的进行多账户配置。
注意,在windows下,这个认证配置好像是暂时的,关闭git之后就失效了,所以需要每次重新配置,即重新使用:
1 | exec ssh-agent bash |
github 使用
初始化git信息
1 | git config --global user.name cuiwenyao |
连接到自己的账户
ssh key
使用以下命令生成ssh key 并命名为 id_rsa_cuiwenyao_github
1 | ssh-keygen -t rsa -C "yao1970099540@163.com" -f ~/.ssh/id_rsa_cuiwenyao_github |
不想为这个ssh key生成密码的话就一直回车
这会在 ~/.ssh/目录下生成ssh key
id_rsa_cuiwenyao
id_rsa_cuiwenyao.pub
将id_rsa_cuiwenyao.pub添加到github中的用户setting 中的ssh key 中。
1 | exec ssh-agent bash |
将使用id_rsa_cuiwenyao进行验证,只有这样才可以进行 push 等操作
自己只需要本地保存自己账户的ssh key即可,按照这里的进行多账户配置。
windows中这个权限确认状态好像只是临时的,需要每一次打开git时重新使用以上命令进行配置。
验证配置是否成功:
1 | ssh -T git@github.com |
multy account and multy ssh keys
除了上述的额命令外,还需要在 ./ssh 下写一个 config 文件
内容如下:
1 | #cuwenyao |
协同开发
fork 别人的项目
别人的仓库: Repo_A
fork之后到自己的仓库中 Repo_fork
修改后push到自己的仓库 Repo_fork 中
发起一个 pull request
仓库拥有者接受 pull request