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