3 入门篇
3.1 常用命令使用说明
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]
The most commonly used git commands are:
add Add file contents to the index
bisect Find the change that introduced a bug by binary search
branch List, create, or delete branches
checkout Checkout and switch to a branch
clone Clone a repository into a new directory
commit Record changes to the repository
diff Show changes between commits, commit and working tree, etc
fetch Download objects and refs from another repository
grep Print lines matching a pattern
init Create an empty git repository or reinitialize an existing one
log Show commit logs
merge Join two or more development histories together
mv Move or rename a file, a directory, or a symlink
pull Fetch from and merge with another repository or a local branch
push Update remote refs along with associated objects
rebase Forward-port local commits to the updated upstream head
reset Reset current HEAD to the specified state
rm Remove files from the working tree and from the index
show Show various types of objects
status Show the working tree status
tag Create, list, delete or verify a tag object signed with GPG
- 撤消操作
# 撤消当前所有操作,恢复上次状态
$git reset --hard HEAD
# 恢复某个文件 hello.rb
$git checkout hello.rb
# 撤消上次版本
$git revert HEAD
- 与远程同步
# 将本地的 git 档案与 github(远程) 上的同步
git push
# 将 github(远程) 的 git 档案与本地的同步(即更新本地端的 repo)
git pull
# 例如,pull 指令其实包含了 fetch(將变更复制回來) 以及 merge(合并) 操作
git pull git:**//**github.com**/**tom**/**test.git
- 分支使用
版本控制系統的 branch 功能也很有意思,若同时修改 bug,又要加入新功能,可以 fork 出一个 branch:一个专门修 bug,一个专门加入新功能,等到稳定后再 merge 合并
git branch bug_fix # 建立 branch,名为 bug_fix
git checkout bug_fix # 切换到 bug_fix
git checkout master #切换到主要的 repo
git merge bug_fix #把 bug_fix 这个 branch 和现在的 branch 合并
# 若有 remote 的 branch,想要查看并 checkout
git branch -r # 查看远程 branch
git checkout -b bug_fix_local bug_fix_remote # 把本地端切换为远程的 bug_fix_remote branch 并命名为 bug_fix_local
3.2 正常的工作流程
表格 git 工作流模式
Git 工作流模式 | 特性概要 | 适用团队规模 |
---|---|---|
Git Flow | · 经典工作模式 · 复杂但严谨· 内耗大但安全稳定· 全流程可控可追溯 | 20 人以上 |
GitHub Flow | · 基于分支合并评审的工作模式· 重视小团队的线上合作· 适用于敏捷开发及 DevOps | 5~20 人 |
Trunk Based | · 仅使用一条 Trunk 分支·简约的工作模式· 规避合并冲突· 适用于个人项目、敏捷开发及 DevOps | 5 人以下 |
常用命令:git init/diff/add/rm/status/show/log/commit
创建一个版本库
git init
增加/删除文件
git add <modified files>
git rm <modified files>
- 提交
# 使用 commit 将快照/索引中的内容提交到版本库中
git commit -m "msg"
# 也可以将 git add 与 git commit 用一个指令完成
git commit -a -m "msg"
- 状态查看
git log #可以查看每次 commit 的改变
git diff #可以查看最近一次改变的內容,加上参数可以看其它的改变并互相比较
git show #可以看某次的变更
# 若想知道目前工作树的状态,可以輸入
git status
3.3 分布式的工作流程
3.3.1 创建公共仓库/主干树
创建一个空仓库,裸放的,不作开发,可为原始主干库,公共仓库$git --bare init --shared
创建一个开发仓库,文件信息放入.git 目录,如示例仓库名 proj.
$ cd {proj} $ git init
2)使用克隆方式建立一个公共的裸仓库 dst_proj
$ git clone --bare [src_proj] [dst_proj]
$ touch proj.git/git-daemon-export-ok //非必需,告诉系统这是个裸仓库
$ scp [dst_pro] user@host://xxx
3.3.2 拷贝一个仓库
可以使用 SSH, HTTPS, GIT 等各种网络协议连接到远程仓库。
仓库地址:[Protocol:]user@user@user@IP$workpath //若无协议头,则缺省 SSH:
$git clone [user@ubuntu.unix-center.net/home/p/d/xxxxx](mailto:user@ubuntu.unix-center.net/home/p/d/xxxxx)
$git clone [user@ubuntu.unix-center.net/~/xxxxx](mailto:user@ubuntu.unix-center.net/~/xxxxx)
$git clone ssh://qfwu@61.145.124.165:37856/home/qfwu/yyusmodel --upload-pack=~/app/bin/git-upload-pac
$git clone [git@github.com:dennycn/script.git](mailto:git@github.com:dennycn/script.git)
$git clone https://github.com/dennycn/script.git
- git 协议导出仓库
需启动 git-daemon. 命令如下:
$ git-daemon --reuseaddr –port=9418 --base-path=/home/git
- http 协议导出仓库
你需要把新建的"裸仓库"放到 Web 服务器的可访问目录里,同时做一些调整,以便让 web 客户端获得它们所需的额外信息。
$ mv proj.git /home/you/public_html/proj.git
$ cd proj.git
$ git --bare update-server-info
$ chmod a+x hooks/post-update
3.3.3 本地同步远程仓库流程
- 本地修改并提交到本地
// git add 增加文件,git status 查看是否更改
$git commit –m “add localhost”
- 本地修改后提交到远程
//origin 为源端名 name,master 为本地分支名 branch
\#git push origin master
$git push xxxx@xxxx:
- 更新远程仓库
$git pull
$git pull xxx@xxxx [origin_master]
注: git pull = git fetch + git merge
3.3.4 克隆指定分支
git clone -b [branch_name] [repo_url]
3.3.5 创建空分支
有时候我们需要在 GIT 里面创建一个空分支,该分支不继承任何提交,没有父节点,完全是一个干净的分支,例如我们需要在某个分支里存放项目文档。
使用传统的 git checkout 命令创建的分支是有父节点的,意味着新 branch 包含了历史提交,所以我们无法直接使用该命令。
查看远程所有分支: -a
git branch -a
创建一个名为 docs 的分支,并且该分支下有前一个分支下的所有文件。但无历史纪录
法 1:使用 git checkout--orphan
git checkout --orphan docs
git rm -rf .
法 2:使用 git symbolic-ref
git symbolic-ref HEAD refs/heads/newbranch
rm .git/index
git clean -fdx
# 此时空日志,需要 git add xxx; git commit -m 'xxx'; git push origin [branch]才有第一条 commit 日志
<do work>
git add your files
git commit -m 'Initial commit'
3.4 commit 修改与合并
3.4.1 git reset:撤销 commit 修改
git-reset - Reset current HEAD to the specified state
usage: git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]
or: git reset [-q] <tree-ish> [--] <paths>...
or: git reset --patch [<tree-ish>] [--] [<paths>...]
-q, --quiet be quiet, only report errors
--mixed reset HEAD and index
--soft reset only HEAD
--hard reset HEAD, index and working tree
--merge reset HEAD, index and working tree
--keep reset HEAD but keep local changes
-p, --patch select hunks interactively
-N, --intent-to-add record only the fact that removed paths will be added later
# 本地仓库撤销,可以将本地的仓库回滚到上一次提交时的状态,`HEAD^`指的是上一次提交。`HEAD` ^[num]表示可撤销前 num 次提交。
$ git reset --hard HEAD^
# 完成撤销,同时将代码恢复到前一 commit_id 对应的版本。
$ git reset --hard commit_id
# 完成 Commit 命令的撤销,但是不对代码修改进行撤销,可以直接通过 git commit 重新提交对本地代码的修改。
$ git reset commit_id
# 远程仓库跟随本地仓库撤销,保持本地与远程的状态一致,即回滚。
$ git push origin [branch] -f
3.4.2 git rebase: 合并多个 commit
注意事项 :需要合并的 commit 只能是本地仓库的,不能已经 push 到服务器。
Your branch is ahead of 'origin/master' by 2 commits.
说明:一般 git status 上面提示的 commit 要大于等于 2,-i 指向的 commit 是不需要修改的,可以是最后一次 push 的 commit,或者还未提交 commit 中的某个,合并只会影响到-i 指向的 commit 之后的提交。-i 指向的 commit 不能超过最后一次 push 之前的 commit,否则会产 生很多重复的 commit log,而且仓库混乱(另外,合并项列单的第一个 commit 不能 squash,会提示不是一个 single reversion)。
git-rebase - Reapply commits on top of another base tip
git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
[<upstream> [<branch>]]
git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
--root [<branch>]
git rebase --continue | --skip | --abort | --edit-todo
示例:
$ git rebase -i [branch|********]
你可以直接进入某个分支的 rebase 也可以进入某次 commit 的 rebase,如果你是将某些 commit 合并,那么建议使用 $ git rebase -i
。
此外 rebase 还提供三个操作命令,分别是 --continue
、 --absort
和 --skip
,这三个命令的意思分别是“继续”、“退出”和“跳过”。
合并执行顺序:
1). 设定需要合并的 commit 起始值, -i
的参数是需要合并的 commit 的 hash 值。如果未设-i 后的值,那么默认是从还未提交到远程仓库的 commit 开始。
git -i [hash_valus]
2). 得到一个指令文件,指令 cmd 可用全名,也可只用首字母。
[cmd] [hash] [commitlog]
- pick 的意思是要会保留这个 commit,缺省值,若无修改,最终会列出所有合并的 commit 作为新的 commit
- squash 的意思是这个 commit 会被合并到前一个 commit, 这说明保证至少有两个以上的 commit(不包括-i 指向的 commit)才能进行这操作,否则会出现合并错误,可通过 rebase --absort 放弃本次合并操作。
- fixup 提交,类似 squash,但放弃 commit log.
- edit:
- drop: 不提交,放弃本次编辑。
3). 提交修改
$git rebase --continue
$git push origin [branch] -f
4). 撤销修改 git rebase
git rebase --abort
来撤销修改,回到没有开始操作合并之前的状态。
3.4.3 git merge:合并分支
有时我们并不需要分支太多的 commit,只需保留最新一条。
1. 直接合并(straight merge) :
首先先到 master 分支,然后直接合并:
git checkout master
git merge dev
说明:注意没参数的情况下 merge 是快进式(Fast-forward) 的,即 Git 将 master 分支的指针直接移到 dev 的最前方。
2. 压合合并(squashed commits) :
将一条分支上的若干个提交条目压合成一个提交条目,提交到另一条分支的末梢。
把 dev 分支上的所有提交压合成主分支上的一个提交,即压合提交:
git checkout master
git merge --squash dev
此时,dev 上的所有提交已经合并到当前工作区并暂存,但还没有作为一个提交,可以像其他提交一样,把这个改动提交到版本库中:
git commit –m “something from dev”
说明:使用--squash 参数,这样提交的 commit 只有一个 parent,即原来的分支。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论