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

原理

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯奶茶吧~