Software is like sex: it's better when it's free. —— Linus Torvalds
前情须知 -O-
强行提交前要谨慎,确定无误
工作流
首先要明确的是Git的工作流程,你使用Git时,用了三个不同的区域对你的代码进行管理。
1.工作区(workshop):就是你当前写代码的那些文件,具体就是你当前正在编辑的项目。
2.缓存区(Index):是一个临时区域,保存你的临时改动。
3.仓库区(HEAD):你最后提交到的区域。
一般的流程:(工作区)编码 → 添加代码到(缓存区)→ 提交到仓库区(HEAD)→ 推送到远程仓库
基本使用
init 初始化
当我们要使用git对项目进行管理的时候,使用:
$ git init
初始化时修改默认分支名称
以下都是能在初始化时,指定创建的分支为main
而不是master
$ git init -b main
$ git init --initial-branch=main
就会自动进行相关的初始化操作,会在项目中创建隐藏的.git文件夹
,里面有相关的配置信息。
add 缓存区操作
要Git对文件进行跟踪,这时文件就到了缓存区了,是相当于复制了一份,使用命令:
# 添加文件到缓存区
$ git add [文件名1] [文件2]
# 添加文件夹到缓存区
$ git add [文件夹]
# 添加所有文件到缓存区
$ git add .
执行了改命令后,Git就会跟踪你的文件的变化了,使用 git status
命令,就可以看到文件的状态了。
# 查看文件状态
$ git status
# 查看简洁的状态信息 short
$ git status -s
当然你也可以将缓存区的删除操作
# 停止追踪指定文件,该文件仍会保留在工作区
$ git rm --cached [file]
commit仓库区操作
使用git commit
命令会将缓存区的操作,添加到仓库区,每次提交都要添加提交信息
# 将缓存区的文件提交到仓库区
#然后会打开vm编辑器要求输入提交信息
$ git commit
# 简化,提交和添加提交信息
$ git commit -m '提交信息'
# 跳过添加到缓存区,直接将上一次提交后的修改进行提交
# 所有已经跟踪过的文件暂存起来一并提交
$ git commit -a
当一个文件已经被提交后,要提交删除该文件的记录,使用$ git rm [文件名]
命令,工作区的对应文件会被删除,删除记录会添加到缓存区,然后可以commit
修改提交信息(修改一般应在push之前)
在提交的时候总免不了提交信息输入有错误的时候。不改的话心里又不舒服,那怎么改呢?
1.如果是修改最后一次的提交,那直接使用:git commit --amend
那就会进行入Vim编辑器编辑内容。
2.如果是要改多次的记录,使用 git rebase -i HEAD~2
可改最近两次的记录,当然也可~3
之类的。
如我有三次提交记录:
commit fd6169282b10e2141631ff8c64d2f286068138fe
提交2
commit ab87b986a872c56df8c55de228e76911993e4a7b
提交1
commit 65818ffaa30e9ccf6b51433f485fa77af365e91b
init
执行之后,上面的是你提交的记录,下面的注释是命令说明:
pick ab87b98 提交1
pick fd61692 提交2
# Rebase 65818ff..fd61692 onto 65818ff (2 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
按i
进入编辑模式,将要修改的记录前的pick
改成e
或edit
。然后wq
保存退出。便会有提示。
git commit --amend
进行入修改你之前改了e
的条目。然后修改保存退出。
edit ab87b98 提交1
pick fd61692 提交2
- 然后执行
git rebase --continue
你的修改记录就出现在你当前分支上了。 git log
就能看到你的提交信息已经修改了。
3.如果要合并提交记录
同样使用git rebase -i HEAD~2
,将要合并的记录前面改成s
或squash
pick ab87b98 提交1
squash fd61692 提交2
然后就会有之前的信息,进行修改,没被注释的信息都是可以修改的,然后会作为此次合并的信息。修改后,保存就是此次合并的修改了。
remot远程操作
Git的操作基本上都是本地进行的,但是若是要多人协助,保存/开源到Gitee或Github上就要进行远程操作了。
# 添加一远程仓库,并未之命名
# 当你在github中新建仓库后,它就会让你运行该命令
# 让你的本地仓库和远程仓库关联,它可以添加多个
$ git remote add [远程仓库命名] [url]
$ git remote add origin https://gitee.com/mashiro-xxx/xxxx.git
# 查看所有远程仓库
$ git remote -v
# 有远程仓库后,将新分支上传
$ git push -u [远程仓库] [分支]
$ git push -u origin master
# 将本地分支上传
$ git push [远程仓库名] [分支名]
$ git push origin master
# 直接推送到远程仓库
$ git push
# 暴力推送到远程仓库,不理会冲突
$ git push --force
# 将远程仓库的代码下载到本地
# 此操作并不会改变本地仓库
# 而是,会在本地有一个远程仓库的分支,如origin/master
$ git fetch [远程仓库]
# 将远程仓库拉取到本地,并合并到本地操作
# 其本质是 fetch 后将,本地分支与远程分支merge
$ git pull [远程仓库] [分支]
回退操作
使用Git不仅为了方便版本管理,当然也是为了以备不时之需,所以也是回退代码的可能也是很高的呢。
注:执行回退操作前,切记要将当前工作区内容提交
# 撤销工作区指定文件的操作,撤销至add时的状态
$ git restore [文件]
# 将缓存区的文件回退至工作区
$ git checkout [文件]
# 将缓存区的全部文件回退到工作区
$ git checkout .
# 将工作区回退至上一次commit
$ git reset --hard
# 回退当前分支的HEAD为指定commit
# 同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]
branch分支操作
分支就像是同一个变种衍生出来的各种变种,每个分支可以有不同的变异方向。不过在Git中分支是可控的,你可以增加,合并,删除。
# 查看当前所有分支
$ git branch
# 新建分支
$ git branch [分支名]
$ git branch dev
# 且换分支
$ git checkout [分支]
$ git checkout master
# 新建并切换到新建的分支
$ git checkout -b [分支]
$ git checkout -b feature_x
# 删除分支,若没有有未被合并的内容,则无法删除
# 不能删除当前所在的分支,如要删除需切换分支
$ git branch -d [分支]
# 强制删除分支
$ git branch -D [分支]
# 当前所在分支与指定分支合并
$ git merge [分支]
$ git merge dev
创建无父依赖的分支
$ git checkout --orphan 分支名
此命令在创建分支时不会有父分支,也就是它创建的分支是独立的,和父分支没有依赖关系。创建成功后,原分支的文件会在创建时添加到当前暂存区。它是个全新的分支,没有任何的提交。
使用此命令可以将多个(相关)项目,放到统一仓库下进行git管理。
other其它操作
# 查看所有提交的记录
$ git log
# 暂时将未提交的变化保存
$ git stash
# 暂时将未提交的保存的变化恢复
$ git stash pop
使用代理
受限于国内的网络环境,在返回GitHub的时候可能会很慢。而且拉取或克隆GitHub上的项目也会非常慢。为了优化体验,可以设置代理。
http的代理
## 设置
git config --global http.proxy "http://127.0.0.1:8080"
git config --global https.proxy "http://127.0.0.1:8080"
## 取消
git config --global --unset http.proxy
git config --global --unset https.proxy
为GitHub指定socket5代理
## 设置
git config --global http.https://github.com.proxy 'socks5://127.0.0.1:10808'
## 取消
git config --global --unset http.https://github.com.proxy
其代理的是https这种协议的链接,所以:
# 有代理
https://github.com/flutter/samples.git
# 无代理
git@github.com:flutter/samples.git
git配置操作
# 查看当前所有配置
git config -l
# 删除某一项配置
git config --global --unset user.name
# 编辑配置
git config --global --edit
其它使用
Git多账号使用
同时使用多个git的账号
生成密钥文件
ssh-keygen -t rsa -C mailegitee@qq.com
ssh-keygen -t rsa -C mailegitlab@qq.com
在.ssh
文件夹下创建config
文件,为不同的域指定对应的密钥。配置文件内容:
# 配置gitee
Host gitee.com
HostName gitee.com
IdentityFile ~/.ssh/gitee/id_rsa
PreferredAuthentications publickey
User yourname
# 配置gitlab
Host 192.2.2.18
HostName 192.2.2.18
IdentityFile ~/.ssh/gitlab/id_rsa
PreferredAuthentications publickey
User 你的名字
把公钥在不同的站点进行设置。
此时可以进行提交,但提交所使用的name
和email
都是全局设置的。如要单独设置,则在仓库目录添加局部的信息:
git config user.name "xxx"
git config user.email "flyree@fzsw.com"