Github_study

git初始化本地仓库和基本操作

 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
32
33
34
35
36
37
  mkdir cangku					# 建一个空文件夹

  cd cangku						# 进入创建的文件夹

  git init 						# 将该文件夹初始化为本地仓库

  git config --global user.name "name" # "name"对应github注册时的用户名

  git config --global user.email "email" # "email"对应github注册时的用户名

  git remote add origin <远程仓库地址> # 添加远程仓库地址

  echo "Hello" >> newFile			# 创建一个"newFile"文件并添加"Hello"

  git add .						# 添加本地仓库所有文件到暂存区

  git commit -m "Commit a file."	# 对添加到文件暂存区的内容添加文件描述

  git checkout -b main			# 创建本地分支

  git push -u origin main			# 将文件暂存区的内容推送到远程的"main"分支

  git checkout -b develop master	# 创建一个基于 master 的叫做 develop 的新分支

  git checkout main 				# 切换到 main 分支

  git merge --no-ff develop		# Git执行"快进式合并"(fast-farward merge),会直接将 Master 分支指向 Develop 分支

  git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke themes/ananke # 将一个仓库克隆到某一子目录下,并且会添加子模块到当前目录,这样的操作不会影响主目录的 git 仓库操作

  git log 或 git reflog			# 查看提交记录

  git reset --hard 894bece		# 版本回退到该提前记录

  git push -f						# 强制推送

  git rebase -i HEAD~n 			# 使用 git rebase -i HEAD~5 压缩5个commit为1个,或者git rebase -i 51efaef517abdbf674478de6073c12239d78a56a (第一个commit的id),然后在vim编辑器中,按i编辑,将后4个commit的pick修改为fixup,保留第一个pick。按esc键,输入:wq保存退出。

.gitmodules 内容展示

1
2
3
[submodule "hugo1/themes/hugo-theme-stack"]
        path = hugo1/themes/hugo-theme-stack
        url = https://github.com/CaiJimmy/hugo-theme-stack/

推送和拉取

推送

push -u 推送到远程分支时与远程分支内容合并
push -f 推送到远程分支时与覆盖远程分支内容
1
2
3
  git push -u origin master
  git pull -f origin master

拉取

pull 拉取远程分支内容
1
  git pull origin master

git fatal: 拒绝合并无关的历史的错误解决方法

1
  git pull origin master --allow-unrelated-histories

git pull 命令时出现了冲突

这通常是因为远程仓库和本地仓库的历史记录不一致导致的。

  1. 执行 git status 命令查看当前的状态,确认哪些文件存在冲突。
  2. 手动编辑冲突的文件,解决冲突。冲突通常会被标记为类似以下内容的标记:
1
2
3
4
5
  <<<<<<< HEAD
  // 本地仓库中的代码
  =======
  // 远程仓库中的代码
  >>>>>>> FETCH_HEAD

您需要手动选择保留哪些代码,并删除冲突标记,直到文件中所有的冲突都得到解决。

  1. 解决冲突后,执行 git add <冲突文件> 将已解决冲突的文件标记为已解决。
  2. 最后执行 git commit 提交解决冲突后的修改。

【Git】 如何将一个分支的某个提交合并到另一个分支

在使用 Git 进行版本控制时,常常会遇到这样的需求:将某个分支的特定提交合并到另一个分支中。这种情况下,我们可以使用 cherry-pick 命令来实现。本文将详细介绍 cherry-pick 命令的使用方法,并介绍一些 cherry-pick 的高级用法。

什么是 git cherry-pick

git cherry-pick 命令可以将某个分支上的特定提交应用到当前分支上。与 merge 或 rebase 不同,cherry-pick 只关注指定的提交,而不处理整个分支的变更历史。

基本用法

以下是使用 git cherry-pick 将一个分支的某个提交合并到另一个分支的具体步骤:

切换到目标分支

首先,切换到你希望将提交合并到的目标分支。

1
  git checkout 目标分支

例如,如果目标分支是 main,则执行:

1
  git checkout main
找到提交的哈希值

在源分支中找到你想要合并的那个提交的哈希值(SHA-1)。你可以通过以下命令查看提交日志:

1
  git log 源分支

例如:

1
  git log feature

找到你需要的提交的哈希值,例如 abc123。

Cherry-pick 提交

使用 cherry-pick 命令将该提交合并到当前分支。

1
  git cherry-pick 提交的哈希值

例如:

1
  git cherry-pick abc123
解决冲突

在 cherry-pick 过程中可能会遇到冲突。此时需要手动解决冲突,然后继续 cherry-pick 过程。

解决冲突后,添加解决冲突后的文件:

git add 解决冲突后的文件

继续 cherry-pick 过程:

1
  git cherry-pick --continue

如果想要放弃这次 cherry-pick,可以使用以下命令:

1
  git cherry-pick --abort

cherry-pick 的其他用法

合并多个提交

如果需要一次性合并多个提交,可以在 cherry-pick 后面指定多个提交的哈希值:

1
  git cherry-pick 哈希值1 哈希值2 哈希值3

也可以使用提交范围:

1
  git cherry-pick 哈希值A..哈希值B

编辑提交信息

在 cherry-pick 的时候,可以使用 -e 选项来编辑提交信息:

1
  git cherry-pick -e 提交的哈希值

保留提交信息

使用 -x 选项可以在提交信息中加入原始提交的引用信息,方便追溯:

1
  git cherry-pick -x 提交的哈希值

忽略空提交

使用 –skip 选项可以跳过空的提交(即已经应用的变更):

1
  git cherry-pick --skip

总结一下

git cherry-pick 是一个非常有用的命令,可以帮助我们将特定的提交从一个分支应用到另一个分支。在使用过程中,遇到冲突时需要手动解决,并可以利用一些高级选项来增强 cherry-pick 的功能。通过掌握这些技巧,能够更灵活地管理项目的版本控制。

查看和删除分支

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
  git branch						#查看本地分支

  git branch -r					#查看远程分支

  git branch -a					#查看本地和远程分支

  git branch -d 本地分支名		#删除本地分支

  git push origin --delete 远程分支名 #删除远程分支

  git push origin 远程分支名		#推送空分支到远程(删除远程分支的另一种实现)

修改远程仓库地址

方法1

1
2
3
4
5
  git remote set-url origin <url>

  git remote rm origin

  git remote add origin <url>

方法2(先删后加)

1
2
3
  git remote rm origin #删除远程仓库地址

  git remote add origin <url> #添加远程仓库地址

方法3(直接修改配置文件)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  进入git的根目录,编辑config文件,将文件中的内容修改成自己的

  [core]

  repositoryformatversion = 0 

  filemode = false

  bare = false

  logallrefupdates = true

  symlinks = false

  ignorecase = true

  hideDotFiles = dotGitOnly

  [remote "origin"] 

  url = <仓库地址>

  fetch = +refs/heads/*:refs/remotes/origin/*

Git 仓库的远程列表

查看远程列表

要查看 Git 仓库的远程列表,我们可以使用 git remote 命令。这个命令会列出所有远程仓库的名称。

1
2
  git remote
  origin

如果仓库有多个远程仓库,我们可以使用 -v 选项查看更详细的信息,包括每个远程仓库的 URL。

1
  git remote -v

构建github代码文件链接的方法

1
2
3
4
5
6
7
  对于 GitHub 上的代码文件,可以通过以下方式构建它的 raw 格式链接:
  https://raw.githubusercontent.com/:owner/:repo/:branch/:path/to/file
  其中:
  - :owner - 仓库所属的用户或组织名
  - :repo - 仓库的名称
  - :branch - 代码所在的分支,通常是 master
  - :path/to/file - 仓库内文件的路径

其他操作

1
2
3
4
5
  git fetch origin "远程分支名" # 将指定的远程分支与本地建立链接
  git remote add "test" "远程仓库链接" # 用git将"远程仓库"起别名为"test"  
  git fetch test master:dev	  # pull取远程仓库最新代码(需要新分支来储存),test为远程仓库名,默认为origin
  git diff dev				  # 查看远程最新分支与本地最新分支的区别,这里dev是新建分支
  git merge dev				  # 将远程最新分支与本地最新分支合并

参考链接

https://blog.csdn.net/xiaoxgongzs/article/details/105099281

要将一个 Git 仓库作为子模块添加到另一个 Git 仓库中,你可以按照以下步骤操作:

  1. 在父项目中初始化子模块: 在父项目的根目录下打开命令行或终端,并执行以下命令:
1
  git submodule add <子模块的远程仓库地址> <子模块的存放路径>

例如:

1
  git submodule add https://github.com/CaiJimmy/hugo-theme-stack/ themes/hugo-theme-stack

这将把 hugo-theme-stack 作为子模块添加到 themes/hugo-theme-stack 路径中。

  1. 提交更新: 添加子模块后,父项目会有一些变动,需要提交到版本控制系统中:
1
  git commit -m "Add hugo-theme-stack submodule"
  1. 初始化子模块(如果有必要): 在父项目的根目录下执行以下命令来初始化子模块:
1
  git submodule update --init --recursive

这会将子模块的代码拉取到本地,使得父项目能够使用它。

  1. 提交更新: 如果你初始化了子模块,那么子模块的代码也会被拉取到本地,需要将这些变动提交到版本控制系统中:
1
  git commit -m "Initialize hugo-theme-stack submodule"
  1. 推送更新(可选): 如果需要,将父项目的更新推送到远程仓库:
1
  git push

以上步骤将会在父项目中成功添加一个子模块。在执行这些步骤之前,请确保你对子模块的路径和远程仓库地址有正确的了解,并且你有权限访问这些仓库。

子模块索引过,如何再次索引

如果你已经删除了相关的索引文件(比如.gitmodules文件)并且配置文件中也不包含索引信息,但仍然无法添加子模块,可能是由于Git仓库中还存在一些缓存或其他问题导致的。

你可以尝试以下步骤来清除可能导致无法添加子模块的问题:

  1. **清除子模块缓存**:

    1
    
    git rm --cached hugo1/themes/hugo-theme-stack
  2. **删除子模块目录**:

    1
    
    rm -rf hugo1/themes/hugo-theme-stack
  3. **提交更改**:

    1
    2
    3
    
    git add .
    git commit -m "Remove submodule hugo-theme-stack"
    git push

完成以上步骤后,你可以尝试重新添加子模块:

1
git submodule add https://github.com/CaiJimmy/hugo-theme-stack/ hugo1/themes/hugo-theme-stack

以上步骤来源于 chatgpt,而我实际操作的时候只执行了第一步,即清除子模块缓存,然后执行最后一步,即重新添加子模块

Git 如何解决从GitHub克隆仓库时出现的SSL证书自签名问题

解决方案

在解决SSL证书自签名问题前,我们先要了解一下Git配置中和SSL有关的几个关键属性:

  • http.sslVerify:该属性用于指定是否验证SSL证书,默认值为true,表示验证证书。
  • http.sslCAInfo:该属性用于指定SSL证书的位置,提供自定义的CA证书进行验证。
  • http.sslCAPath:该属性用于指定SSL证书的路径,提供自定义的CA证书进行验证。

方案一:忽略SSL证书验证

当您确定从GitHub上克隆仓库的过程中,SSL证书问题不会对仓库的安全性产生威胁时,您可以选择忽略SSL证书验证。在使用Git命令进行克隆操作时,可以添加-c选项,并指定http.sslVerify=false参数

操作方式

1
  git -c http.sslVerify=false clone https://github.com/username/repo.git

通过设置http.sslVerify为false,Git会跳过证书验证,并将通信与GitHub建立起来。

使用实例

1
  git -c Http.sslVerify=false clone https://hub.nuaa.cf/hexgio/emacs_config.git

git reset –hard

git reset –hard 是一个Git命令,其作用是将当前的工作目录和索引(即暂存区)都重置为指定的提交(commit),并且丢弃所有未提交的修改。

具体来说,它的作用如下:

  1. 重置工作目录和暂存区: 使用 –hard 选项会将工作目录和暂存区完全重置为指定的提交状态。这意味着当前的工作目录中的所有未提交的修改都会被删除,包括未添加到暂存区的文件修改和已经添加到暂存区但未提交的更改。
  2. 丢弃所有本地修改: 如果你在工作目录中进行了一些修改(比如编辑文件、添加新文件等),但是还没有提交这些更改,运行 git reset –hard 将会丢弃所有这些修改,使工作目录变成指定提交的状态。
  3. 慎重使用: 由于 git reset –hard 会永久丢弃所有未提交的工作,因此在使用时需要特别小心。确保你真的希望丢弃所有本地修改并将工作目录恢复到指定提交的状态。

总之,git reset –hard 是一个强制性的命令,可以帮助你彻底清理和重置本地工作目录和暂存区,回到指定提交的状态。

在 Git 中,reset 和 –hard 是两个不同的命令和选项,它们分别具有以下作用:

  1. git reset

git reset 命令用于将当前分支的 HEAD 指针重置为指定的状态,并且可以选择是否更新暂存区和工作目录。

  • 作用: 主要用于撤销提交、重置当前分支的位置或者在不同的模式之间切换。
  • 常见用法:

    • git reset <commit>:将当前分支的 HEAD 指针移动到 <commit>,并且不更改暂存区和工作目录。这个命令通常用于撤销提交或者移动到不同的提交上。
    • git reset –soft <commit>:将 HEAD 指针移动到 <commit>,并且保留暂存区和工作目录的更改。这个命令通常用于撤销最近的一次提交,并且保留更改以便重新提交。
    • git reset –mixed <commit>(默认行为):将 HEAD 指针移动到 <commit>,并且重置暂存区,但是保留工作目录的更改。这个命令通常用于取消暂存的更改或者将暂存区和工作目录的状态与指定提交保持一致。
    • git reset –hard <commit>:将 HEAD 指针移动到 <commit>,并且重置暂存区和工作目录,使它们与指定提交完全一致。这个命令通常用于彻底清理工作目录并重置到指定的提交状态。
  1. –hard 选项

–hard 是 git reset 命令的一个选项,用于指定重置的模式之一。它的作用是:

  • 作用: 在执行 git reset 时,–hard 选项会重置当前分支的 HEAD 指针,并且彻底重置暂存区和工作目录,使它们与指定的提交完全一致。
  • 注意事项: 使用 git reset –hard 时要非常小心,因为它会永久删除未提交的工作目录中的所有更改。任何未提交的更改都将被彻底清除。

综上所述,git reset 是一个多功能命令,可以用来移动 HEAD 指针和管理暂存区、工作目录的状态。而 –hard 是 git reset 命令的一种选项,用于彻底重置工作目录和暂存区,以使它们与指定的提交完全一致。

git reset 命令在 Git 中有三种常见的重置模式,它们是:

  1. –soft 模式:

    • git reset –soft <commit>:在这种模式下,Git 会将 HEAD 指针移动到 <commit>,但是不会重置暂存区和工作目录。这意味着所有的更改都会保留在工作目录中,并且保留在暂存区,因此你可以随时使用 git commit 命令来提交这些更改。
    • 典型用途:用于取消上一次提交,并将更改保留在工作目录和暂存区,以便进一步调整或重新提交。
  2. –mixed 模式:

    • git reset –mixed <commit> 或 git reset <commit>(默认模式):这种模式是 git reset 的默认行为。在这种模式下,Git 会将 HEAD 指针移动到 <commit>,同时重置暂存区的状态,但是保留工作目录中的更改。
    • 典型用途:用于取消暂存的更改,或者将暂存区和工作目录的状态与指定的提交保持一致。
  3. –hard 模式:

    • git reset –hard <commit>:这是最强制的重置模式。在这种模式下,Git 会将 HEAD 指针移动到 <commit>,并且彻底重置暂存区和工作目录,使它们与指定的提交完全一致。
    • 典型用途:用于完全丢弃工作目录中的所有未提交更改,并将工作目录恢复到指定提交的状态。

这些模式允许你根据需要选择不同级别的重置操作。在选择使用 –soft、–mixed 或 –hard 时,务必注意其影响范围,以免意外丢失或保留不必要的更改。

Git在检出代码时遇到了问题,可能是由于网络问题或Git版本不兼容

异常现象

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ git clone https://www.modelscope.cn/pzc163/chatTTS.git
正克隆到 'chatTTS'...
remote: Enumerating objects: 49, done.
remote: Counting objects: 100% (49/49), done.
remote: Compressing objects: 100% (39/39), done.
remote: Total 49 (delta 15), reused 29 (delta 8), pack-reused 0
接收对象中: 100% (49/49), 6.23 KiB | 398.00 KiB/s, 完成.
处理 delta 中: 100% (15/15), 完成.
致命错误:协议错误:错误的行长度字符串:Not
警告:克隆成功,但是检出失败。
您可以通过 'git status' 检查哪些已被检出,然后使用命令
'git restore --source=HEAD :/' 重试

解决方式

1
  git restore --source=HEAD :/

github的一些快捷键和在线编辑器

github的一些常用快捷键

按键 说明
s 跳转到搜索框
t 用于仓库内的文件搜索
l 在仓库文件显示页,键入l后在弹处窗口输入行号,表示跳转到该文件的指定行
b 查看文件改动进度
ctrl+k 快速定位查看内容模块
. 进入在线编辑器模式

GitHub 看代码神器

  • 只需将github网页地址中github.com改为github1s.com (增加的字符是123的"1"和"s")
  • GitHub 官方出的 Online VSCode 编辑器:输入.键(句号键),相当于把仓库地址中github.com改为github.dev
1
参考:https://blog.csdn.net/cqcre/article/details/120398001
  • 地址前加上 (https://) gitpod.io/#/,,即把地址中gihub.com改为gitpod.io/#/github.com,直接进入gitpod。
1
2
可在线运行脚本,里面有安装的依赖包。
可直接一键构建docker镜像。

Git 如何使用一条命令来获取Git根目录

在本文中,我们将介绍如何使用一条命令来获取Git根目录。在Git中,根目录是指包含.git文件夹的顶级目录,它是整个Git仓库的起始点。

使用git rev-parse命令获取Git根目录

Git提供了一个名为git rev-parse的命令,可以用来解析、处理Git对象以及获取与之相关的信息。通过使用git rev-parse命令,我们可以获取Git根目录的绝对路径。

要获取Git根目录的绝对路径,可以在命令行中输入以下命令:

1
  git rev-parse --show-toplevel

这将返回Git根目录的绝对路径。例如,假设我们的Git仓库位于/Users/username/git-repo目录中,那么以上命令将返回/Users/username/git-repo。你可以在自己的Git仓库中尝试该命令,看看它是否返回了正确的根目录路径。

示例

让我们通过一个示例来进一步说明如何使用git rev-parse命令获取Git根目录。

首先,我们在命令行中切换到我们的Git仓库所在的目录。

1
cd /path/to/git-repo

接下来,我们可以使用git rev-parse –show-toplevel命令来获取Git根目录的路径。

1
  git rev-parse --show-toplevel

结果将会显示Git根目录的绝对路径。

1
  /path/to/git-repo

通过执行以上命令,我们成功地获取了Git根目录的路径。

其他方法

除了使用git rev-parse命令之外,还有一些其他方法可以获取Git根目录的路径。这些方法可能更简洁或更适合特定的情况,但可能不如git rev-parse命令灵活。

使用git rev-parse –show-cdup命令可以返回到Git根目录所需的相对路径。 使用git rev-parse –git-dir命令可以返回相对于当前目录的.git文件夹的路径。

在Git的钩子脚本中,可以使用git rev-parse命令获取Git根目录以及其他相关信息,用于自定义的处理逻辑。

请注意,使用这些方法时需要切换到Git仓库所在的目录。

总结

通过使用git rev-parse命令,我们可以方便地获取Git根目录的路径。该命令对于构建自定义的Git工具或在Git钩子脚本中进行自定义处理非常有用。除了git rev-parse命令之外,还有一些其他方法可以获取Git根目录的路径,但可能不如git rev-parse命令灵活。希望本文对你理解如何获取Git根目录有所帮助。

我的push与pull脚本

push脚本

upload.sh

1
2
3
4
5
6
7
  cd $(git rev-parse --show-toplevel)

  git add .

  git commit -m "test"

  git push -u origin $(git branch | awk '{print $2}')

pull脚本

pull.sh

1
2
3
  cd $(git rev-parse --show-toplevel)

  git pull origin $(git branch | awk '{print $2}')

强制push脚本

force_upload.sh

1
2
3
4
5
6
7
  cd $(git rev-parse --show-toplevel)

  git add .

  git commit -m "test"

  git push -f origin $(git branch | awk '{print $2}')

强制pull脚本

force_pull.sh

1
2
3
4
5
6
7
  cd $(git rev-parse --show-toplevel)

  git fetch origin

  git reset --hard origin/$(git branch | awk '{print $2}')

  git pull origin $(git branch | awk '{print $2}')

将脚本整合到一起

git_push_pull.sh

 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
32
33
34
35
36
37
38
  case $1 in
	  push)
		  cd $(git rev-parse --show-toplevel)

		  git add .

		  git commit -m "test"

		  git push -u origin $(git branch | awk '{print $2}')
		  ;;
	  force_push)
		  cd $(git rev-parse --show-toplevel)

		  git add .

		  git commit -m "test"

		  git push -f origin $(git branch | awk '{print $2}')
		  ;;
	  pull)
		  cd $(git rev-parse --show-toplevel)

		  git pull origin $(git branch | awk '{print $2}')
		  ;;
	  force_pull)
		  cd $(git rev-parse --show-toplevel)

		  git fetch origin

		  git reset --hard origin/$(git branch | awk '{print $2}')

		  git pull origin $(git branch | awk '{print $2}')
		  ;;
	  ,*)
		  echo "Usage:"
		  echo "$0 push|force_push|pull|force_pull"		
		  ;;
  esac

在执行 git pull 操作时,本地的某些文件发生了修改,而这些修改未被提交。git pull 操作会试图将远程分支的更改合并到本地分支,但这会导致你本地的修改被覆盖,从而产生了冲突

为了解决这个问题,你可以采取以下几种方法之一:

1. 提交本地更改

如果你希望保留你本地的修改,最简单的做法是先将本地更改提交,再进行合并操作。步骤如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 查看当前文件修改的状态
git status

# 将文件添加到暂存区
git add filename

# 提交更改
git commit -m "保存本地修改"

# 进行拉取操作
git pull

2. 暂存本地更改

如果你暂时不想提交本地更改,可以使用 git stash 来存储本地更改,再进行拉取操作。步骤如下:

1
2
3
4
5
6
7
8
# 暂存本地更改
git stash

# 拉取远程代码
git pull

# 恢复本地更改
git stash pop

3. 丢弃本地更改

如果你确定不需要保留本地的更改,可以直接丢弃这些修改。步骤如下:

1
2
3
4
5
# 丢弃本地更改
git checkout -- filename

# 拉取远程代码
git pull

选择合适的方式取决于你是否需要保留本地的修改。如果你不确定如何操作,可以先用 git status 查看当前本地的修改情况,然后决定是否提交、暂存或丢弃这些修改。

当前分支 Master 没有对应的上游分支

为推送当前分支并建立与远程上游的跟踪,使用:

1
git push --set-upstream origin Master
Licensed under CC BY-NC-SA 4.0