Blog/public/about-git/index.html

325 lines
18 KiB
HTML
Raw Normal View History

2025-01-02 21:19:48 +08:00
<!DOCTYPE html>
<html lang="en">
<head>
<title>Dich&#x27;blog</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<meta name="robots" content="noodp"/>
<link rel="stylesheet" href="https://blog.dich.bid/style.css">
<link rel="stylesheet" href="https://blog.dich.bid/color/blue.css">
<link rel="stylesheet" href="https://blog.dich.bid/color/background_dark.css">
<link rel="stylesheet" href="https://blog.dich.bid/font-hack-subset.css">
<meta name="description" content="">
<meta property="og:description" content="">
<meta property="og:title" content="Dich'blog">
<meta property="og:type" content="article">
2025-01-21 19:11:02 +08:00
<meta property="og:url" content="https://blog.dich.bid/about-git/">
2025-01-02 21:19:48 +08:00
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:description" content="">
<meta name="twitter:title" content="Dich'blog">
<meta property="twitter:domain" content="blog.dich.bid">
2025-01-21 19:11:02 +08:00
<meta property="twitter:url" content="https://blog.dich.bid/about-git/">
2025-01-02 21:19:48 +08:00
<link rel="alternate" type="application/atom+xml" title="Dich&#x27;blog Atom Feed" href="https://blog.dich.bid/atom.xml" />
</head>
<body class="">
<div class="container">
<header class="header">
<div class="header__inner">
<div class="header__logo">
<a href="https://blog.dich.bid" style="text-decoration: none;">
<div class="logo">
Dich&#x27;blog
</div>
</a>
</div>
</div>
2025-01-21 19:11:02 +08:00
<nav class="menu">
2025-01-02 21:19:48 +08:00
<ul class="menu__inner">
2025-01-21 19:11:02 +08:00
<li><a href="https://blog.dich.bid">blog</a></li>
2025-01-02 21:19:48 +08:00
<li><a href="https://blog.dich.bid/tags">tags</a></li>
<li><a href="https://blog.dich.bid/archive">archive</a></li>
2025-01-21 19:11:02 +08:00
<li class="active"><a href="https://blog.dich.bid/about">about me</a></li>
2025-01-02 21:19:48 +08:00
<li><a href="https://blog.dich.bid/links">links</a></li>
<li><a href="https://blog.dich.bid/search">search</a></li>
<li><a href="https://github.com/Dichgrem" target="_blank" rel="noopener noreferrer">github</a></li>
</ul>
</nav>
</header>
<div class="content">
<div class="post">
2025-01-21 19:11:02 +08:00
<h1 class="post-title"><a href="https://blog.dich.bid/about-git/">乱七八糟:Git使用简明手册</a></h1>
2025-01-02 21:19:48 +08:00
<div class="post-meta-inline">
<span class="post-date">
2023-12-15
</span>
</div>
<span class="post-tags-inline">
:: tags:&nbsp;
<a class="post-tag" href="https://blog.dich.bid/tags/luan-qi-ba-zao/">#乱七八糟</a></span>
<div class="post-content">
<p>前言 Git作为现代软件开发中不可或缺的版本控制工具常常让初学者感到困惑。本文旨在介绍 Git 的全流程安装和基本使用,希望能够帮助新手更轻松地理解和掌握 Git 的基本概念和操作。</p>
<span id="continue-reading"></span><h2 id="an-zhuang-git">安装git</h2>
<p>Windows<a href="https://git-scm.com/download/">https://git-scm.com/download/</a></p>
<p>Archlinux<code>sudo pacman -S git</code></p>
<p>安装完成后检查版本:<code>git --version</code></p>
<h2 id="chuang-jian-xin-cang-ku">创建新仓库</h2>
<p>如果你的目录不是一个 Git 仓库,你需要先初始化。</p>
<p>创建新文件夹,在你的项目目录中运行以下命令:<br />
<code>git init</code></p>
<p>设置默认仓库为 main,避免因为 main/master 名称不同的牛马问题:</p>
<p><code>git init --initial-branch=main</code></p>
<h2 id="ke-long-cang-ku">克隆仓库</h2>
<p>执行如下命令以创建一个本地仓库的克隆版本:<br />
<code>git clone /path/to/repository</code><br />
如果是远端服务器上的仓库,你的命令会是这个样子:<br />
<code>git clone username@host:/path/to/repository</code></p>
<h2 id="lian-jie-yuan-cheng-cang-ku">连接远程仓库</h2>
<p>生成密钥:</p>
<p><code>ssh-keygen -t rsa -b 4096 -C "your_email@example.com"</code></p>
<p>可以生成多个不同名字的密钥:</p>
<p><code>ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f ~/.ssh/github_key1</code></p>
<p><code>ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f ~/.ssh/github_key2</code></p>
<p>使用 <code>ssh-add</code> 命令将生成的密钥添加到 SSH 代理中。</p>
<p><code>ssh-add ~/.ssh/github_key1</code></p>
<p><code>ssh-add ~/.ssh/github_key2</code></p>
<p><code>~/.ssh/config</code> 文件中配置不同的主机别名以及相应的密钥文件。编辑该文件并添加以下内容:</p>
<p><code># GitHub repository 1</code></p>
<p><code>Host github1</code></p>
<pre style="background-color:#151515;color:#e8e8d3;"><code><span>HostName github.com
</span><span>
</span><span>User git
</span><span>
</span><span>IdentityFile ~/.ssh/github_key1
</span></code></pre>
<p><code># GitHub repository 2</code></p>
<p><code>Host github2</code></p>
<pre style="background-color:#151515;color:#e8e8d3;"><code><span>HostName github.com
</span><span>
</span><span>User git
</span><span>
</span><span>IdentityFile ~/.ssh/github_key2
</span></code></pre>
<p>随后将cat ~/.ssh/id_rsa.pub,将其添加至 Github的Deploy密钥中勾选write权限</p>
<p>连接到github</p>
<p><code>ssh -T git@github.com</code></p>
<p>添加远程仓库:</p>
<p><code>git remote add origin &lt;remote_repository_url&gt;</code></p>
<p>比如我已经在 GitHub 上创建了一个名为 <code>dichos</code> 的仓库,你可以使用以下命令将其添加为远程仓库:</p>
<p><code>git remote add origin git@github.com:Dichgrem/dichos.git</code></p>
<p>设置远程仓库</p>
<p><code>git remote set-url origin git@github.com:Dichgrem/dichos.git</code></p>
<h2 id="gong-zuo-liu">工作流</h2>
<p>本地仓库由 git 维护的三棵“树”组成。第一个是你的 <code>工作目录</code>,它持有实际文件;第二个是 <code>暂存区Index</code>,它像个缓存区域,临时保存你的改动;最后是 <code>HEAD</code>,它指向你最后一次提交的结果。</p>
<h2 id="chuang-jian-yi-ge-fen-zhi">创建一个分支</h2>
<p><code>git branch main</code></p>
<p>这将创建一个名为 main 的分支。</p>
<h2 id="shan-chu-fen-zhi">删除分支</h2>
<p><code>git branch -d master</code></p>
<p>使用大写强制删除</p>
<p><code>git branch -D master</code></p>
<h2 id="tian-jia-he-ti-jiao">添加和提交</h2>
<p>你可以提出更改(把它们添加到暂存区),使用如下命令:<br />
<code>git add &lt;filename&gt;</code><br />
<code>git add *</code><br />
这是 git 基本工作流程的第一步;使用如下命令以实际提交改动:<br />
<code>git commit -m "代码提交信息"</code>如:</p>
<p><code>git commit -m "Initial commit"</code><br />
现在,你的改动已经提交到了 <strong>HEAD</strong>,但是还没到你的远端仓库。</p>
<h2 id="tui-song-gai-dong">推送改动</h2>
<p>你的改动现在已经在本地仓库的 <strong>HEAD</strong> 中了。执行如下命令以将这些改动提交到远端仓库:<br />
<code>git push origin master</code><br />
可以把 <em>master</em> 换成你想要推送的任何分支。</p>
<p>如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:<br />
<code>git remote add origin &lt;server&gt;</code><br />
如此你就能够将你的改动推送到所添加的服务器上去了。</p>
<h2 id="he-bing-fen-zhi">合并分支</h2>
<p>分支是用来将特性开发绝缘开来的。在你创建仓库的时候,<em>master</em> 是“默认的”分支。在其他分支上进行开发,完成后再将它们合并到主分支上。</p>
<p>创建一个叫做“feature_x”的分支并切换过去<br />
<code>git checkout -b feature_x</code><br />
切换回主分支:<br />
<code>git checkout master</code><br />
再把新建的分支删掉:<br />
<code>git branch -d feature_x</code><br />
除非你将分支推送到远端仓库,不然该分支就是 <em>不为他人所见的</em><br />
<code>git push origin &lt;branch&gt;</code></p>
<h2 id="geng-xin-yu-he-bing">更新与合并</h2>
<p>要更新你的本地仓库至最新改动,执行:<br />
<code>git pull</code><br />
以在你的工作目录中 <em><strong>获取</strong>fetch</em><em><strong>合并</strong>merge</em> 远端的改动。<br />
要合并其他分支到你的当前分支(例如 master执行<br />
<code>git merge &lt;branch&gt;</code><br />
在这两种情况下git 都会尝试去自动合并改动。遗憾的是这可能并非每次都成功并可能出现_冲突conflicts<em>。 这时候就需要你修改这些文件来手动合并这些_冲突conflicts</em>。改完之后,你需要执行如下命令以将它们标记为合并成功:<br />
<code>git add &lt;filename&gt;</code><br />
在合并改动之前,你可以使用如下命令预览差异:<br />
<code>git diff &lt;source_branch&gt; &lt;target_branch&gt;</code></p>
<h2 id="biao-qian">标签</h2>
<p>为软件发布创建标签是推荐的。这个概念早已存在,在 SVN 中也有。你可以执行如下命令创建一个叫做 <em>1.0.0</em> 的标签:<br />
<code>git tag 1.0.0 1b2e1d63ff</code><br />
<em>1b2e1d63ff</em> 是你想要标记的提交 ID 的前 10 位字符。可以使用下列命令获取提交 ID<br />
<code>git log</code><br />
你也可以使用少一点的提交 ID 前几位,只要它的指向具有唯一性。</p>
<h2 id="ri-zhi">日志</h2>
<p>如果你想了解本地仓库的历史记录,最简单的命令就是使用:<br />
<code>git log</code><br />
你可以添加一些参数来修改他的输出,从而得到自己想要的结果。 只看某一个人的提交记录:<br />
<code>git log --author=bob</code><br />
一个压缩后的每一条提交记录只占一行的输出:<br />
<code>git log --pretty=oneline</code><br />
或者你想通过 ASCII 艺术的树形结构来展示所有的分支, 每个分支都标示了他的名字和标签:<br />
<code>git log --graph --oneline --decorate --all</code><br />
看看哪些文件改变了:<br />
<code>git log --name-status</code><br />
这些只是你可以使用的参数中很小的一部分。更多的信息,参考:<br />
<code>git log --help</code></p>
<h2 id="ti-huan-ben-di-gai-dong">替换本地改动</h2>
<p>假如你操作失误(当然,这最好永远不要发生),你可以使用如下命令替换掉本地改动:<br />
<code>git checkout -- &lt;filename&gt;</code><br />
此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到暂存区的改动以及新文件都不会受到影响。</p>
<p>假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:<br />
<code>git fetch origin</code><br />
<code>git reset --hard origin/master</code></p>
<h2 id="xiu-gai-mo-ren-fen-zhi">修改默认分支</h2>
<p>git目前默认的主分支为 master和 github 默认分支 main 不同,这使得默认配置下 git 往往连接失败。可以通过下两种方法改变默认分支。在本地 git init 时将默认分支修改成main</p>
<pre style="background-color:#151515;color:#e8e8d3;"><code><span>1. git --version //查看版本
</span><span>2. git config --global init.defaultBranch main //将默认分支修改成main
</span><span>3. git init //本地项目文件夹内创建.git文件夹
</span><span>4. git add . //添加到暂存区
</span><span>5. git commit -a [描述的内容] //记录修改行为
</span><span>6. git pull --rebase origin main //拉github上的readme.md
</span><span>7. git push origin main //上传代码
</span></code></pre>
<p>也可以不修改git上的默认分支而是修改github上库的默认分支。</p>
<h2 id="windowsxia-gitshi-yong-dai-li">Windows下git使用代理</h2>
<p>由于网络环境的差异Git连接github需要代理或者全局模式。Git支持四种协议而除本地传输外还有git://, ssh://, 基于HTTP协议这些协议又被分为哑协议HTTP协议和智能传输协议。对于这些协议要使用代理的设置也有些差异</p>
<ul>
<li>
<p>使用 <code>git协议</code> 时,设置代理需要配置 <code>core.gitproxy</code></p>
</li>
<li>
<p>使用 <code>HTTP协议</code> 时,设置代理需要配置 <code>http.proxy</code></p>
</li>
<li>
<p>而使用 <code>ssh协议</code>代理需要配置ssh的 <code>ProxyCommand</code> 参数</p>
</li>
</ul>
<p>由于个人需求仅仅是 HTTP 的代理相对来说HTTP 有比较好的通适性Windows 配置git/ssh比较棘手设置的时候只需要针对单个设置 <code>http.proxy</code> 即可,在需要使用代理的项目下面使用 <code>git bash</code> 如下命令进行设置你的Uri和port可能和我的不同</p>
<p><code>git config http.proxy</code> <a href="http://127.0.0.1:8088">http://127.0.0.1:2080</a> <code># 也可以是uri:port形式</code></p>
<p>这个是不需要鉴权的代理设置,如果需要鉴权,可能需要添加用户名密码信息:</p>
<p><code>git config http.proxy</code> <a href="http://username:password@127.0.0.1:8088">http://username:password@127.0.0.1:2080</a></p>
<p>如果git的所有项目都需要启用代理那么可以直接启用全局设置</p>
<p><code>git config --global http.proxy</code> <a href="http://127.0.0.1:8088">http://127.0.0.1:2080</a></p>
<p>为了确认是否已经设置成功,可以使用 <code>--get</code> 来获取:</p>
<p><code>git config --get --global http.proxy</code></p>
<p>这样可以看到你设置在global的 <code>http.proxy</code> 值。 </p>
<p>需要修改的时候再次按照上面的方法设置即可git 默认会覆盖原有的配置值。</p>
<p>当我们的网络出现变更时,可能需要删除掉原有的代理配置,此时需要使用 <code>--unset</code> 来进行配置:</p>
<p><code>git config --global --unset http.proxy</code></p>
<p>在命令之后,指定位置的设置值将会被清空,你可以再次使用 <code>--get</code> 来查看具体的设置情况。</p>
<p>如果使用了 HTTPS肯呢个会碰到 HTTPS 证书错误的情况,比如提示: <code>SSL certificate problem</code> ,此时,可以尝试将 <code>sslVerify</code> 设置为 <code>false</code> </p>
<p><code>git config --global http.sslVerify false</code></p>
<p>恩,到此,可以试试 git 来获取/更改项目了,此时,项目应该是使用代理来进行通讯的。</p>
<h2 id="zhu-yi">注意</h2>
<ul>
<li>不要多次使用不同的参数来设置代理,一般使用文中两种方式酌情选用即可, <code>--global</code> <code>--system</code> <code>--local</code> 各级设置后可能会给自己带来不必要的麻烦。git默认是先到 git Repository 的配置文件中查找配置文件,如果没有才会到 <code>--global</code> 设置的文件中查找,因此,单个项目文件中的设置会覆盖 <code>--global</code> 的设置。</li>
<li>使用 <code>--global</code> 来配置的信息保存在当前用户的根目录下的 <code>.config</code> 文件中,而仓库中的配置保存在项目仓库的根目录下的 <code>.git/config</code> 文件中。</li>
<li>如果是 Linux 的用户,建议全局代理。</li>
</ul>
<blockquote>
<p>20240501更新完系统出现以下报错:</p>
</blockquote>
<pre style="background-color:#151515;color:#e8e8d3;"><code><span>sign_and_send_pubkey: signing failed for RSA &quot;/home/dich/.ssh/id_rsa&quot; from agent: agent refused operation
</span><span>git@github.com: Permission denied (publickey).
</span><span>致命错误:无法读取远程仓库。
</span><span>
</span><span>请确认您有正确的访问权限并且仓库存在。
</span></code></pre>
<p>解决方法是使用 ssh-add 命令重新添加你的密钥。</p>
<pre style="background-color:#151515;color:#e8e8d3;"><code><span>ssh-add ~/.ssh/id_rsa
</span></code></pre>
</div>
<div class="pagination">
<div class="pagination__title">
<span class="pagination__title-h">Thanks for reading! Read other posts?</span>
<hr />
</div>
<div class="pagination__buttons">
<span class="button previous">
2025-01-21 19:11:02 +08:00
<a href="https://blog.dich.bid/about-junk-cleanup/">
2025-01-02 21:19:48 +08:00
<span class="button__icon"></span>&nbsp;
<span class="button__text">乱七八糟:垃圾清理的艺术</span>
</a>
</span>
<span class="button next">
<a href="https://blog.dich.bid/about-working/">
<span class="button__text">乱七八糟:应届生工作指南</span>&nbsp;
<span class="button__icon"></span>
</a>
</span>
</div>
</div>
</div>
</div>
<footer class="footer">
<div class="footer__inner">
<div class="copyright">
<span>©
2025
Dichgrem</span>
<span class="copyright-theme">
<span class="copyright-theme-sep">:: </span>
Theme: <a href="https://github.com/pawroman/zola-theme-terminimal/">Terminimal</a> by pawroman
</span>
</div>
</div>
</footer>
</div>
</body>
</html>