git的使用


git的使用

菜鸟教程

创建git库

初始化git

1
2
3
mkdir gittest
cd gittest
git init

将要添加的文件加入git管理

add 从工作区到暂存区

1
git add [filename]

或者将目录下所有文件都加入

1
git add .

自定义所要添加的文件

总是手动add每一个太麻烦了,但总有些不希望添加进去的,可以这样。

  • 创建一个文件名为的文件

    .gitignore

  • 文件内容为
    1
    2
    3
    4
    file
    .*
    !.gitignore
    !file1
  • 这表示名为file的文件要加进去
  • 所有文件都要加进去
  • 忽略 .gitignore
  • 忽略 file1

提交到仓库

commit 将暂存区提交到仓库

1
git commit -m [提交描述]

每次commit之前都要add所要进行管理的文件

查看仓库状态

1
2
3
git status
简略版
git status -s

查看文件更改情况

1
git diff [filename]

版本管理

版本回退

在commit之后后悔了

1
2
git log 
git log --oneline //简略版
  • 使用git log 查看之前提交的记录,记下回退的版本号commit id 输入

    1
    git reset --hard [commit id]
  • 注意只有在head指向的版本之前的, 切换版本到当前版本之后的 输入

    1
    git reflog

    撤销修改

  • 丢弃对工作区的修改 add之前

    1
    git checkout -- [filename]
  • checkout就是用版本库里的版本替换工作区的版本*

  • 丢弃对暂存区的修改 add之后 commit之前

    1
    git reset HEAD [filename]

    远程仓库

    创建ssh key

    1
    ssh-keygen -t rsa -C "myemail@163.com"

    在用户目录里找到id_rsa.pub,将里面的数据复制到GitHub中,这样就可以从本地电脑推送到GitHub中了.

    添加远程库

    1
    2
    git remote add repo1 git@github.com:yishuilingbo/gittest.git

    查看本地所有仓库

    1
    git remote -v

    推送到远程库

    1
    git push -u [库名] [分支名]
  • 加上了-u参数,Git不但会把本地的分支内容推送的远程新的分支,还会把本地的分支和远程的分支关联起来,在以后的推送或者拉取时就可以简化命令。

    删除远程库

    1
    git remote rm [库名]

    克隆库

    1
    2
    git clone git@github.com:yishuilingbo/gittest.git
    cd [库名]

分支管理

建立新的分支

1
2
git branch [branchname]

查看所有分支

1
git branch

切换分支

1
git switch branch [branchname]

创建并切换分支

1
git switch -c [branchname]

合并分支到当前分支

1
git merge [来源分支名]

删除分支

1
git branch -d [branchname]
  • 若该分支没有被合并过,以下强制删除
    1
    git branch -D [branchname]

    合并冲突

  • 当两个不同的分支对同一对象进行修改并提交之后会发生 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流程

  1. 当前在dev分支,先保存工作现场
    1
    git stash
  2. 切换到main分支,并建立新的分支bugfix
  3. 在新的分支上修改bug,然后提交后合并到main 产生一个commit id fixbug
  4. 回到dev分支,回复现场
    1
    2
    3
    4
    git stash pop  //这将删除这条stash
    或者
    git stash list //查看stash list
    git stash apply stash@{0}
  5. 将修复的信息复制到当前dev分支
    1
    git cherry-pick [commit id]

多人合作冲突

  1. pull 下来之后手动解决冲突在再合并push

标签

创建标签

  1. 切换到要创建标签的分支上
    1
    git tag [标签名]
    默认标签打在最新的commit上面
  2. 对历史commit打标签
    1
    2
    git log --pretty=oneline --abbrev-commit  //列出历史commit
    git tag [tag] [commit id]
  3. 指定标签信息
    1
    git tag -a [tag] -m [info] [commit id]

标签总是和对应的commit挂钩

删除标签

1
git tag -d [tag]

标签只存储到本地,不会自动推送到远程,可以这样推送到远程

1
2
git push [库名] [tag]
git push [库名] --tags //一次性推送所有标签

删除远程标签

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

步骤

  1. 生成ssh key ,并给生成的文件使用绝对路径特定地命名。
  2. 在 .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


  3. 修改本地仓库地config中的url
    eg:
    gittest地config本来为
    1
    2
    3
    [remote "origin"]
    url = git@github.com:yishuilingbo/gittest.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    修改为:
    1
    2
    3
    [remote "origin"]
    url = git@gittest.github.com:yishuilingbo/gittest.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    即添加上gittest.
  4. 在GitHub上的仓库中添加刚刚生成的deploy key

原理

agent

1
2
3
exec ssh-agent bash
ssh-add ~/.ssh/id_rsa_cuiwenyao
git push

多账户

自己只需要本地保存自己账户的ssh key即可,按照这里的进行多账户配置。

注意,在windows下,这个认证配置好像是暂时的,关闭git之后就失效了,所以需要每次重新配置,即重新使用:

1
2
3
exec ssh-agent bash
ssh-add ~/.ssh/id_rsa_cuiwenyao
git push

github 使用

初始化git信息

1
2
git config --global user.name cuiwenyao
$ git config --global user.email yao1970099540@163.com

连接到自己的账户

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
2
exec ssh-agent bash
ssh-add ~/.ssh/id_rsa_cuiwenyao

将使用id_rsa_cuiwenyao进行验证,只有这样才可以进行 push 等操作

自己只需要本地保存自己账户的ssh key即可,按照这里的进行多账户配置。

windows中这个权限确认状态好像只是临时的,需要每一次打开git时重新使用以上命令进行配置。

验证配置是否成功:

1
ssh -T git@github.com

multy account and multy ssh keys

除了上述的额命令外,还需要在 ./ssh 下写一个 config 文件

内容如下:

1
2
3
4
5
6
7
8
9
10
11
#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


文章作者: 崔文耀
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 崔文耀 !
  目录