mirror of
https://github.com/Dichgrem/Blog.git
synced 2025-02-23 14:08:37 -05:00
330 lines
18 KiB
HTML
330 lines
18 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
|
||
<head>
|
||
<title>Dich'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">
|
||
<meta property="og:url" content="https://blog.dich.bid/about-git/">
|
||
|
||
<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">
|
||
<meta property="twitter:url" content="https://blog.dich.bid/about-git/">
|
||
|
||
<link rel="alternate" type="application/atom+xml" title="Dich'blog Atom Feed" href="https://blog.dich.bid/atom.xml" />
|
||
|
||
|
||
<link rel="icon" type="image/png" href=/dich.webp />
|
||
|
||
</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'blog
|
||
|
||
</div>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
<nav class="menu">
|
||
<ul class="menu__inner">
|
||
<li><a href="https://blog.dich.bid">blog</a></li>
|
||
|
||
<li><a href="https://blog.dich.bid/tags">tags</a></li>
|
||
|
||
<li><a href="https://blog.dich.bid/archive">archive</a></li>
|
||
|
||
<li class="active"><a href="https://blog.dich.bid/about">about me</a></li>
|
||
|
||
<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://blog.dich.bid/weekly">weekly</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">
|
||
|
||
<h1 class="post-title"><a href="https://blog.dich.bid/about-git/">乱七八糟:Git使用简明手册</a></h1>
|
||
<div class="post-meta-inline">
|
||
|
||
<span class="post-date">
|
||
2023-12-15
|
||
</span>
|
||
|
||
</div>
|
||
|
||
|
||
<span class="post-tags-inline">
|
||
:: tags:
|
||
<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 <remote_repository_url></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 <filename></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 <server></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 <branch></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 <branch></code><br />
|
||
在这两种情况下,git 都会尝试去自动合并改动。遗憾的是,这可能并非每次都成功,并可能出现_冲突(conflicts)<em>。 这时候就需要你修改这些文件来手动合并这些_冲突(conflicts)</em>。改完之后,你需要执行如下命令以将它们标记为合并成功:<br />
|
||
<code>git add <filename></code><br />
|
||
在合并改动之前,你可以使用如下命令预览差异:<br />
|
||
<code>git diff <source_branch> <target_branch></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 -- <filename></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 "/home/dich/.ssh/id_rsa" 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">
|
||
<a href="https://blog.dich.bid/about-junk-cleanup/">
|
||
<span class="button__icon">←</span>
|
||
<span class="button__text">乱七八糟:垃圾清理的艺术</span>
|
||
</a>
|
||
</span>
|
||
|
||
|
||
<span class="button next">
|
||
<a href="https://blog.dich.bid/about-working/">
|
||
<span class="button__text">乱七八糟:应届生工作指南</span>
|
||
<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> |