Neurohazard
暮雲煙月,皓首窮經;森羅萬象,如是我聞。

【笔记】Learn Version Control with Git

wpadmin~September 27, 2019 /Software Engineering

Contents

【笔记】Learn Version Control with Git

Learn Version Control with Git: A step-by-step course for the complete beginner

补充

Git 在团队中的最佳实践–如何正确使用Git Flow
https://www.cnblogs.com/wish123/p/9785101.html

Pro Git (官网文档)
https://git-scm.com/book/zh/v2

Learn Version Control with Git: A step-by-step course for the complete beginner
https://www.git-tower.com/learn/git/ebook/en/command-line/introduction

https://pad.360ec.net/s/SJrcFaYPS
https://pad.360ec.net/s/r1LGilcPB

基本概念

一些比较重要的基本概念

  1. 本地仓库 (local repository)

  2. 远程仓库 (remote repository)

  3. 工作副本(Working Copy) / 工作目录 (Working Directory)

  4. 短期分支 (Short-Lived)

  5. 主题分支 (Topic Branches)

Part 1 – 基础知识

Part 1 – 基础知识
– 什么是版本控制?
– 为什么要使用版本控制系统?
– 准备工作
– 基本工作流程
– 从一个未被纳入版本控制的项目开始
– 从一个已被纳入版本控制的项目开始
– 工作在你的项目上

# git 基本配置
git config --global user.name "John Doe"
git config --global user.email "john@doe.org"
git config --global color.ui auto


# 查看当前活跃的分支
# 查看当前 工作目录 (Working Directory) 的状态与上一次 commit 之间的差距
# 以及哪些文件已经被纳入 暂存区 (Staging Area)
git status 

# 查看提交记录
git log [-p]

# 添加 工作目录 (Working Directory) 的改动到 暂存区 (Staging Area)
git add <file_name>

# 克隆项目
git clone https://github.com/gittower/git-crash-course.git

暂存区 (Staging Area) 的才会提交到 commit 。

正确的使用 gitignore
https://github.com/github/gitignore

文件的状态分为 未追踪 (untracked) 和 已跟踪 (tracked) 。

Part 2 – 分支与合并

Part 2 – 分支与合并
– 分支可以改变你的生命
– 在分支上工作
– 暂时保存更改
– 签出一个本地分支
– 合并改动
– 分支的工作流程

你在任何时间的所有的更改只适用于你所工作的 当前活动(currently active) 分支。

# 查看分支
git branch -vva

# 根据当前 HEAD 所指向得分支来新建分支
git branch <branch_name>
git branch feature/add-login

# 切换分支
git checkout <branch_name>

# 合并分支
# 将 <branch_name> 指向的分支合并到 HEAD 指向的分支
# 改变的是 HEAD 指向的分支
git merge <branch_name>

# 储藏操作
git stash

# 查看当前的储藏列表
git stash list

# 恢复储藏前的状态
git stash pop
git stash apply <stashname>

储藏单元功能 (Git Stash)

储藏单元 弹出(pop out) 时只会改动当前的 HEAD 分支 (有*号的)

储藏的时机
1 在切换到不同分支之前。
2 在获取(pulling)远程改动之前。
3 在合并(merging)或者衍合(rebasing)一个分支之前。

Part 3 – 远程仓库

Part 3 – 远程仓库
– 远程仓库
– 连接一个远程仓库
– 查看远程数据
– 整合远程的改动
– 发布一个本地分支
– 删除分支

# 连接远程仓库
git remote add crash-course-remote https://github.com/gittower/git-crash-course-remote.git

# 查看 当前目录下仓库对应的 远程仓库
git remote -v

# 将远程分支拉取到本地,并设置同步追踪
git checkout --track <remote_repository_name>/<branch_name>
git checkout --track origin/faq-content

# 发布本地分支到远程仓库
# 先切换到分支,再进行发布
# -u 参数建立了一种追踪关系
# 只有第一次需要添加 -u 参数,之后直接 git push 就可以。 
# 因为追踪关系已经建立,git 已经知道该推送到哪个远程分支了。
git checkout contact-form
git push -u origin contact-form



# “git push” 命令将会把当前 HEAD 分支上所有新的提交上传到它所关联的远程分支上去。
git push
git push <remote_repository_name> <branch_name>
git push origin faq-content

# 将远程分支的改动整合(merge)到本地
# 拉取远程分支数据,查看改动,但并未合并
git fetch origin
git log origin/master
# 拉取远程分支数据并合并
# 注意,总是整合到当前本地仓库的 HEAD 分支上
git pull


# 删除本地分支
git branch -d contact-form
# 删除远程分支
git branch -dr origin/contact-form

Part 4 – 高级应用

Part 4 – 高级应用
– 撤销操作
– 用 diff 检查改动
– 处理合并冲突
– Rebase 代替合并
– 子模块
– git-flow 的工作流程
– 使用 SSH 公钥验证

撤销

这两个命令(revert and reset)只是工作于当前 HEAD 分支上。因此在你执行这些操作之前,你必须要切换到正确的分支上去。

# 修改最后一次 commit (不要修改已经 push 过的 commit!!!)
# 不要使用 --amend 修改一个已经发布到远程仓库
# 并且很有可能已经被别人 pull 过的 commit
git commit --amend -m "This is the correct message"
# 如果你想要添加更多的改动到上一次提交中,
# 你可以像平常一样把这些新的改动添加到暂存区。
# 然后再次使用 “--amend” 参数进行提交
git add some/changed/file.ext
git commit --amend -m "commit message"

# 本地仓库撤销操作
# 恢复一个文件到上次提交之后的状态
git checkout -- file/to/restore.ext
# 放弃你在工作副本(working copy)中的所有本地改动,
# 并让你的本地副本恢复到上次提交之后的版本
git reset --hard HEAD


# 撤销一个 commit
# 本质上是提交一个新的反向 commit
git revert 2b504be

# 重置 HEAD 指针 回滚(rolling back)
# 它会重置你当前的 HEAD 分支到一个特定旧的版本
# 也被称作 “回滚” 到旧的版本
git reset --hard 2be18d9


diff

# 默认情况下 git diff 只比较工作空间中 unstaged 改动 
git diff
# 如果要查看暂存区中的改动
git diff --staged


# 比较分支
git diff master..feature/contact-form
# 比较 commit
git diff 0023cdd..fcd6199

处理合并冲突

https://www.git-tower.com/learn/git/ebook/cn/command-line/advanced-topics/merge-conflicts#start

Rebase

因此你应该只使用 rebase 来清理你的本地工作,千万不要尝试着对那些已经被发布的提交进行这个操作。
https://www.git-tower.com/learn/git/ebook/cn/command-line/advanced-topics/rebase#start

子模块 (git仓库中的git仓库)

# 克隆时下载子模块
git clone --recurse-submodules ttps://github.com/demo/test.git

# 已经克隆到本地,补充更新子模块
git submodule update --init --recursive https://github.com/demo/test.git

# 子模块状态
git submodule status

Part 5 – 工具与服务

Part 5 – 工具与服务
– 桌面应用程序
– 比较和整合工具
– 代码托管服务
– 更多学习资源

暂无笔记

Leave a Reply

Your email address will not be published. Required fields are marked *