Git 初阶项目管理 实践指南
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。作为初学者,我在学习和使用 Git 的过程中总结了一些需要注意的事项,希望通过这篇博客帮助其他新手快速上手。
1.理解 Git 的核心概念
在开始使用 Git 之前,理解几个基本概念能让你事半功倍:
-
工作区(Working Directory):你本地修改代码的地方。用
git clone
后会自动生成。 -
暂存区(Staging Area):用
git add
将修改暂存的地方,它存在于本地.git
目录中,准备提交到版本库。 -
版本库(Repository):用
git commit
提交后,代码保存于本地.git
目录下。 -
远程仓库(Remote Repository):比如 GitHub、GitLab,用于团队协作。
进一步理解:Git 是一个分布式版本控制系统(Distributed Version Control System, DVCS),这意味着每个开发者本地都有一个完整的仓库副本,而不是像集中式系统那样依赖单一的中央服务器。这种分布式设计直接影响了工作区、暂存区和版本库在每个开发者本地的工作方式。
2.首次提交到远程仓库的步骤
- 首次提交时应初始化本地仓库,并添加远程仓库:
git init
# 将本地仓库与远程仓库关联起来
git remote add origin https://github.com/yiqisoft/device-openvino-c.git
# 验证是否添加成功
git remote -v
输出如下:
origin https://github.com/yiqisoft/device-openvino-c.git (fetch)
origin https://github.com/yiqisoft/device-openvino-c.git (push)
- 添加和提交本地代码:
git add .
git commit -m "add:初次提交到 device-openvino-c 仓库"
git push -u origin main
- 注意:
-u
(--set-upstream)设置上游分支关联,以后只需git push
即可。- 如果是第一次推送,GitHub 可能会要求你输入用户名和 PAT 令牌(或SSH Authentication keys)。用户名是注册邮箱,令牌是github设置主页内的
Personal access tokens
。不过还是建议提前在 GitHub 上生成 SSH keys 一劳永逸。 - 配置 SSH 密钥后,URL 改为
git@github.com:yiqisoft/device-openvino-c.git
。
3.通过 SSH 提交代码到 GitHub
HTTPS 需要每次推送时输入用户名和密码(或 PAT),而 SSH 使用密钥认证,配置一次后无需重复输入凭证,更方便。并且SSH 更安全,适合长期使用。
- 检查和生成 SSH 密钥:(如果看到
id_rsa
私钥和id_rsa.pub
公钥,说明已有密钥)
ls -al ~/.ssh
root@ubuntu:/home/ubuntu/edgex/device-sdk-c/src/c/examples/real/device-openvino-c# ls -al ~/.ssh
total 32
drwx------ 2 root root 4096 Mar 27 16:45 .
drwx------ 9 root root 4096 Apr 2 10:42 ..
-rw------- 1 root root 405 Mar 12 13:46 authorized_keys
-rw-r--r-- 1 root root 70 Mar 27 16:44 config
-rw------- 1 root root 3381 Mar 27 16:27 id_rsa
-rw-r--r-- 1 root root 743 Mar 27 16:27 id_rsa.pub
-rw------- 1 root root 978 Mar 27 16:45 known_hosts
-rw-r--r-- 1 root root 142 Mar 27 16:45 known_hosts.old
- 没有 SSH 密钥则生成: (按回车接受默认路径
~/.ssh/id_rsa
)
ssh-keygen -t rsa -b 4096 -C "你的github邮箱@example.com"
- 将公钥添加到 GitHub:复制输出的内容(以 ssh-rsa 开头)
# 查看公钥内容
cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCPL9xpM/kNKqqrPTq2SITJiPYOHRNtWAC9WehbTYLK6LS2bRxl+xUA3JYgdNQkniF05N2k6AizDDOSTu2CVDLyi9NGor1bEb+9mUYCJAA2sbrDuZJFATdyMrDmKou7rGLWvlNrQAaa2SQAF9cnoXiONuJfQE2drLodrH9v/UeQn2TgZk8ufvA/vXDjcgZLnBZskZ0jJoQx4gckGFAmMBrQWqafhiBPKFPVUW8klogBiMeETdQL30NeGuTnOXf76Tq90KDfKddQMv8D1SsiqWgoaPEJ7RYxK7zAMvlrw1j7k1BEc+KpmdrzDDSkOPv4T1j1AL4mmyo8KGAuwlMF1FufQEZVjeWWk0jHO33iSOabfeZTBAN1Ox8QHkCtVP5OO7Pdo7Km8E+tukVsjCOXtA+Od5mjK4pOZxDQkv86idP+Uzlkm8W5HL3/Chc9S2lahx+WiAX1AVpv18ZTlQN1rqa9pGUlZLjckC7lHDk/mjVNNfkDrH9rGyKH2CerVMNrSSX06BQdBYkDnhFLpwn57kyQs43zVRuin8sxiKKHNHAX349muYUIf63ORB6pHgdSkB4lJF8oQkv5K692okPOlUhN+lzlGjTAGdOZ+FyLFgb2PdGgfKXsAr4ykSoUBm96PoSLarTD2ss9Wqe0b7RI/TK81vMyU/mEeu+RXHJCyWeJ0Q== 1902045311@qq.com
- 登录 https://github.com → 点击右上角头像 → Settings → SSH and GPG keys → New SSH key:
- 粘贴公钥,命名(如 “ssh”),保存:
- 测试 SSH 连接:
ssh -T git@github.com
如果成功,会看到:以后推送/抓取远端仓库就不需要每次都输入密码啦!
Hi! You've successfully authenticated, but GitHub does not provide shell access.
- 如果已用 HTTPS 添加(
https://github.com/yiqisoft/device-openvino-c.git
),修改为 SSH:
git remote set-url origin git@github.com:yiqisoft/device-openvino-c.git
4.谨慎使用危险命令
在 Git 的强大功能背后,一些命令如果使用不当,可能导致代码丢失、历史混乱或团队协作问题。
什么是 HEAD
- 在 Git 中,HEAD 是一个非常核心的概念,它本质上是一个指针,指向你当前工作的位置。理解 HEAD 对于掌握 Git 的操作(如提交、分支切换、回退等)至关重要。随着操作(提交、切换分支等),HEAD 会移动。
- 许多 Git 命令(如
git checkout
、git reset
、git merge
)都以 HEAD 为基准。
git reset HEAD^ # 回退到上一次提交
git diff HEAD HEAD^ # 比较当前和上一次提交的差异
git reset:小心回退过头
git reset
可以回退提交或暂存区的改动,尤其是git reset --hard
,会直接丢弃工作区和暂存区的未提交改动,甚至重写提交历史。示例:运行git reset --hard HEAD^
回退一次提交,但忘了当前改动还没保存,结果代码全丢。- 未提交的改动无法恢复(除非用
git reflog
找回已提交的记录)
# 危险操作
git reset --hard HEAD^ # 丢弃最近一次提交和改动
# 安全替代
git status # 检查是否有未提交改动。
git reset --soft HEAD^ # 保留改动,只回退提交
git rebase:重写历史的双面性
Git rebase 是一个重写提交历史的命令,通过将当前分支的提交“重放”到目标分支上,实现线性化的历史。下图展示其意义:
A - B - E (main)
\
C - D (feature)
git checkout feature
git rebase main
A - B - E - C' - D' (feature)
注意:git rebase
不自动保存未提交的改动,使用 git rebase --abort
中止时只恢复到 rebase 开始前的提交状态。此时未用 git add
和 git commit
保存的内容都会丢失!如果保存过,可以查看 reflog 找回提交。
总结
通过学习和实践 Git,能体会到它作为一个分布式版本控制系统的强大与灵活。从理解核心概念(如工作区、暂存区、版本库)到首次提交代码,再到通过 SSH 实现高效推送,每一步都离不开良好的操作习惯。尤其是在使用 git reset
和 git rebase
等危险命令时,稍有不慎就可能导致代码丢失或历史混乱。
因此,养成以下习惯很有必要:勤于 commit 保存改动,每次小步提交,确保工作有迹可循;操作前用 git status
检查状态,避免误操作;对复杂命令如 rebase
,先备份分支或用 git stash
暂存改动。良好的习惯不仅能提高效率,还能让我们在 Git 的世界里游刃有余,无论是个人项目还是团队协作都能得心应手。