Git 使用笔记

基础使用

远程仓库指 github 仓库(repositoris),本地仓库指自己被 git 管理的文件夹(含有.git 文件夹)。

  • 重新与远程仓库建立联系,并可以提交代码(自己远程仓库有代码 , 本地无代码,比如重装系统或者换电脑):

  • 如果只是本地没有了仓库,在与远程仓库建立链接时提示”远程 origin 已存在 “,可以直接 commit+push。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 克隆远程仓库到本地仓库
    git clone git@github.com:username/repository_name.git(远程仓库地址ssh)
    # cd 进本地仓库
    cd 仓库
    # 初始化 git
    git init
    # 与远程仓库建立链接(关联远程仓库,远程仓库名字叫 origin)
    git remote add origin git@github.com:username/repository_name.git(远程仓库地址ssh)
    # 获取远程更新
    git fetch origin
    # 把更新的内容合并到本地分支
    git merge origin/main
    # 对代码进行一些修改
    git add .
    git commit -m "..."
    git push origin main
  • 创建一个新的仓库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 首先在 github 上创建一个空仓库(之后其实就可以看到教程了)

# 创建一个 README.md 文件,并写入 "# test"
echo "# test " >> README.md
# 初始化.git 文件夹
git init
# 将刚刚创建的 README.md 文件加入 git 管理
git add README.md
# 创建一个提交(即刚刚 README.md 文件的变化)
git commit -m "first commit"
# 创建分支 main 作为默认分支
git branch -M main
# 与远程仓库建立连接,远程仓库的名字默认是 origin(可换)
git remote add origin git@github.com:username/repository_name.git(远程仓库地址ssh)
# 将提交推送到远程仓库(-u 是指第一次提交)
git push -u origin main
  • 把本地的仓库提交到一个新建立的远程仓库(即远程仓库为空,本地已经有了一个包含.git 文件的仓库,希望不改变内容,将本地仓库推送到远程并关联)

  • # 与远程仓库建立连接(关联)
    git remote add origin git@github.com:username/repository_name.git(远程仓库地址ssh)
    # 与远程仓库建立连接,远程仓库的名字默认是 origin(可换)
    git branch -M main
    # 将提交推送到远程仓库(-u 是指第一次提交)
    git push -u origin [分支名]
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    ## 部分报错解决

    + 远程 origin/upstream 已存在:

    ```bash
    # 查看远程配置
    git remote -v
    # 删除远程配置
    git remote rm [远程仓库名] (一般是origin或者upstream)
    # 更改远程配置(可以直接修改,不需要上一步的删除)
    git remote set-url upstream [upstream的新地址]
  • fatal: 拒绝合并无关的历史:

    1
    2
    3
    4
    # 需要将远程仓库和本地仓库关联起来:
    git branch --set-upstream-to=origin/main main
    # 然后使用 git pull 整合远程仓库和本地仓库
    git pull --allow-unrelated-histories# 忽略版本不同造成的影响

如何给开源社区提交 PR

假设官方 GitHub 名叫 [officialName],你的 GitHub 名叫 [yourName],GitHub 仓库名字叫 [repository]。

  1. 网页操作:在官 C 语言代码方 GitHub 仓库 fork 一个相同的仓库到你的 GitHub.

  2. 在你的仓库复制代码地址 [your code SSH/HTTPS],在官方仓库复制代码地址 [official code SSH/HTTPS],然后

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 克隆你 GitHub 仓库到本地
    git clone [your code SSH/HTTPS]
    # 添加官方仓库地址
    git remote add upstream [official code SSH/HTTPS]
    # 检查仓库的远程信息
    git remote -v
    # 远程信息输出应为:
    origin [your code SSH/HTTPS] (fetch)
    origin [your code SSH/HTTPS] (push)
    upstream [official code SSH/HTTPS] (fetch)
    upstream [official code SSH/HTTPS] (push)

    fetch 和 push 分别代表你在 fetch(拉取)和 push(推送)的 GitHub 仓库的地址,origin 代表你的 GitHub 仓库,upstream 代表官方的 GitHub 仓库。

  3. # 从 upstream 中获取最新的代码下载到本地,但是不会自动合并到本地分支中。一般和下面第二个命令一起使用。
    git fetch upstream
    # 将 upstream 的 master 分支合并到当前本地分支中,如果有冲突需要手动解决(本地分支的代码就与 upstream 的 master 分支保持同步)
    git merge upstream/master
    # 创建并切换到名为 fixBug 的新分支
    git checkout -b fixBug
    # 将当前分支 fixBug 推送到远程仓库 origin 上,并将本地分支和远程分支关联起来。
    git push -u origin fixBug
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    4. 之后,你可以在 fixBug 分支上进行一些修改,然后通过一下步骤将修改好的代码 push 到 GitHub 仓库的对应分支。

    当你需要切换分支时,你必须 commit 当前的代码。

    你的每一次 comiit 都会有所记录,当你 push 后,会把所有的 commit 都交上去,如果你 commit 的文件涉及到一个 pr,那么 pr 中也会有所修改,记录你的 commit。

    ```bash
    # 查看修改了那些文件
    git status
    # 查看修改内容
    git diff
    # add 提交
    git add .
    # commit 提交(如果官方仓需要 Signed-off-by 检查的就带账号邮箱信息)
    git commit -m "xxxxx" -s
    # 将过去的 n 个 commit 合并为一个 commit(等待尝试)
    git rebase -i HEAD~n # 打开一个编辑器,将第二行开始的每一行的第一个单词从 pick 改为 squash。然后保存文件并退出。另一个编辑器会打开,在这里修改最终的提交信息。
    # 将本次提交合并到上一次提交,如果你上一次提交已经 push 过,需要使用--force 或者--force-with-lease 选项来强制推送。可能会覆盖其他人在远程仓库上做的修改,谨慎使用。
    git commit --amend # 会打开一个编辑器,让你修改提交信息。
    # push 到远程仓
    git push origin
  4. 此时,你的 GitHub 仓库的 fixBug 分支的代码已经发生了变化,在 Pull requests 界面你可以找到提交 PR 的方法,然后就就可以按照社区要去提供代码了。对于本地的代码,一旦你创建分支之后,master 和 fixBug 就是两份代码了,你在 fixBug 的修改并不会影响到 master 的的代码。你可以通过 git checkout [分支名] 来切换到你想要的分支。你可以创建多个分支来确保工作的顺利进行。

其他有用的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 分支操作:
# 查看所有分支
git bC语言代码
ranch(*代表当前所在分支)
# 删除分支
git branch -d [branchName](-d换为-D强制删除)
# 更改分支名
git branch -m [oldName] [newName]

# 从远程仓库 upstream 拉取代码(获取最新的代码,但不会将其合并到本地)
git fetch upstream
# 从远程仓库 origin 拉取代码(获取最新的代码,但不会将其合并到本地)
git fetch origin
# 比较本地仓库当前的分支 HEAD 和 upstream/master 分支之间的差异
git diff HEAD upstream/master

# 显示本地的 commit 历史版本
git log
# 根据 commit 历史版本号,可以进行版本回退
git reset [版本号]
# 将本地分支重置为最新拉取的 upstream 仓库的版本
git reset --hard upstream/<upstream_branch_name>
# 将本地分支重置为 oorigin 仓库的版本
git reset --hard origin/<origin_branch_name>
# 将本地仓库的更改推送到 origin(-f 选项强制推送更改,这将覆盖 origin 仓库中的所有更改)
git push -f origin <local_branch_name>

# 删除本地未跟踪的目录和文件(d 和 f 分别指目录和文件)
git clean -df
# 从 origin 指定的(自己的)GitHub 仓库拉取代码
git fetch origin