Git
Git
GitHub Host 加速
下载软件:SwitchHosts
添加一条规则:
SwitchHosts Rule
方案名:GitHub(可以自行命名)
类型:远程
URL 地址:https://cdn.jsdelivr.net/gh/ineo6/hosts/hosts
自动更新:1个小时
SSH Server
Clone form server file using SSH:
git clone ssh://root@120.78.71.220:22/~/data
Connect using ssh:
ssh root@174.137.62.75
ssh key:
ssh-keygen
repo
Workflow Usage
repo 的工作流可以参考这个文档(注意有中文版,可以切换语言查看)[1],其流程大概可以总结为以下步骤:
repo start
git add .
git commit .
repo upload
其中几个 repo 专有的命令如下表格所示[^2]:
command | description | example |
---|---|---|
repo init | Initializes a new client. | |
repo sync | Syncs the client to the repositories. | |
repo start | Starts a new branch. | |
repo status | Shows the status of the current branch. | |
repo upload | Uploads changes to the review server. |
以下是使用的例子(简单的 workflow, 后文会详细研究每一个命令):
repo sync PROJECT0 PROJECT1 ... PROJECTN
repo start BRANCH_NAME .
repo status .
如果我们要给特定的项目创建分支,则:
repo start BRANCH_NAME PROJECT_NAME
切换分支还是使用 checkout
命令,但是查看分支可以使用
git branch
repo branches
如果要查看修改,则使用:
repo diff
# or
cd ~/WORKING_DIRECTORY/PROJECT
git diff --cached
修改完后,我们同步最新改动并提交我们的改动:
repo sync
repo upload
repo init
我们需要一个 xml 文件来制定 init 的,一般而言这个 xml 文件在远程,可以使用 -u
参数进行指定,官方对此的使用说明如下:
repo init -u url [options]
在当前目录中安装 Repo。这样会创建一个 .repo/
目录,其中包含存放 Repo 源代码和标准 Android 清单文件的 Git 代码库。
如果我们要重新 init, 则删除这个 .repo/
目录即可。
需要注意的是,这个 .repo/
目录是影响到所有得子目录的,这个和 git 的原理类似。
选项:
-u
: 指定从中检索清单代码库的网址。常见清单位于https://android.googlesource.com/platform/manifest
。-m
: 选择代码库中的清单文件。如果未选择清单名称,则默认为default.xml
。-b
:指定修订版本,即特定的 manifest-branch。
提示
注意:对于所有剩余的 Repo 命令,当前的工作目录必须是 .repo/
的父目录或该父目录的子目录。
Git Reset
在某次提交后如果发现自己忘记添加某些文件,或者写错了提交信息,可以使用--amend
选项
一个使用 --amend 的例子:
git commit -m "initial commit"
git add forgotten_file
git commit --amend
撤销已暂存的文件
git reset HEAD reset.md
舍弃对文件的修改
git checkout -- <filename>
git checkout -- .
!但是要主要到,git checkout
是一条非常危险的命令,执行该命令以后,任何对文件作出的修改都会丢失,因为上述命令用之前版本的文件做了覆盖。
回到远程仓库的状态
git fetch --all && git rest --hard origin/master
放弃所有更改
git checkout .
删除新增文件
git clean -xdff
注意这个是把新增的未保存到缓冲区的文件给删除掉
如果是改动过的,就继续使用 git checkout – .
就可以了。
Git Config
git config --global user.name <username>
git config --global user.email <useremail>
git config --global core.editor emacs
git config --list
git config user.name
git help <verb>
cache the config:
git config --global credential.helper cache
git config --global credential.helper store
如果遇到了 443 的问题,则可以重置 git 的配置:
git config --global credential.helper store
GitHub Accelerate
Update the host in
C:\Windows\System32\drivers\etc
Found the IP and update hosts as the follow example:
13.250.177.223 github.com
151.101.228.133 assets-cdn.github.com
151.101.73.194 github.global.ssl.fastly.net
Git Clone
克隆较慢时使用:
git clone --depth=1 ulr
Tag
show tag:
git tag
git tag -l
add tag:
git tag -a v1.0 -m "my first version"
push tags to origin:
git push origin v1.0
强制推送使用:
git push -f origin branch_name
Status
git status
git status -s
# ??: untrack
# M : Modified
# A : Modified new file
.gitignore
cat .gitignore
*.[oa]
*~
#Example
*.a
!lib.a # 仍然跟踪 lib.a, 即使上一行指令要忽略
/TODO # 忽略当前目录的 todo 文件
build/ # 忽略 build/ 目录下的所有文件
doc/*.txt # 忽略 doc/notes.txt, 而不忽略 doc/server/arch.txt
doc/**/*.pdf # 忽略 doc/ 目录下的所有.pdf文件
如果改动文件不生效的话,使用:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
除此之外,还可以参考GitHub官方示例
Differ
如果想知道具体的变更内容,而不像 git status
那么宽泛,可以使用 git diff
查看有哪些已暂存的内容会进入下一次提交,该命令将暂存的变更与上一次提交的内容相比较:
git diff --staged
git diff --cached
如果要把文件保存在工作目录,但从暂存区移除该文件:
rm <filename>
git rm --cached README
git rm log/\*.log
git mv README.md README
查看提交历史:
git log
git log -p -2
查看简略信息:
git log --stat
Remote
列出远程仓库的简短名称:
git remote
显示出Git存储的每个远程仓库对应的 URL:
git remote -v
检查远程仓库,列出远程仓库的 url 地址以及每个分支的跟踪信息:
git remote show origin
添加一个远程仓库,并给它起一个简短的名称以便于引用:
git remote add [shortname] [url]
删除远程仓库
git remote rm <rep-name>
从远程仓库获取和拉取数据:
git fetch [remote-name]
# e.g. git fetch pb
将变更推送到远程仓库:
git push origin master
需要注意的一点是,推送变更时需要拥有远程仓库的写权限,并且克隆后没有任何其他人向远程仓库推送过数据。如果别人和你都clone了这个仓库,而他先推送,你后推送,那么你的这次推送会直接被拒绝。你必须先拉取别人的变更,将其整合到你的工作成果中,然后才能推送。
Git 别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.unstage 'reset HEAD --'
# git unstage filaA == git reset HEAD --fileA
Git Branch
分支意味着偏离开发主线并继续你自己的工作而不影响主线开发,分支机制是Git的“杀手锏”!
当你创建一个新分支的时候会发生什么?实际上,Git会创建一个可移动的新指针供你使用。
创建分支:
git branch testing
列出所有分支:
git branch
切换分支:
checkout
命令会改变 HEAD 指针,使其指向 testing 分支,在 Gi t中,HEAD 是一个指向当前所在的本地分支的指针
git checkout testing
分支与合并, 创建并切换到该分支,一般使用这个快速创建分支:
git checkout -b testing
切换回master分支:
git checkout master
合并分支:
git merge testing
删除分支:
git branch -d testing
注意到在merge的时候会有提示"fast-forward",这由于当前的master分支所指向的提交是要并入的testing分支的直接上游,因为Git会将master分支指针向前移动。
合并冲突处理,配置合并工具:
git config merge.tool vimdiff
git config merge.conflictstyle diff3
分支管理
查看每个分支上的最新提交:
git branch -v
查看哪些分支已经合并入当前分支的:
git branch --merged
git branch --no-merged
远程分支
如果从Git服务器clone到本地,Git的 clone 命令会自动把这台服务器命名为 origin,使用git clone -o <yourname>
便可以修改远程仓库的默认名称为:your name/master。
如果你在本地的 master 分支上进行了一些工作,与此同时,别人向 Git 服务器推送了数据,更新了服务器上的 master 分支,这时你的提交历史就与服务器上的历史产生了偏离。
于是要与服务器同步,下面的命令会查询 origin 对应的服务器地址,并从服务器取得本地尚未包含的数据,然后更新本地数据库,最后把 origin/master 指针移动到最新的位置上去。
与服务器同步:
git fetch origin
与其他人共享serverfix分支:
git push origin serverfix
git push (remote) (branch)
等价于下述代码的省略形式:
git push origin serverfix:serverfix
第一个为本地分支名,第二个为远程分支名,可把远程分支重命名
跟踪分支
当你克隆一个远程仓库时,Git默认情况下会自动地创建跟踪这远程origin/master分支的本地master分支。除此之外,你也可是设置成不跟踪master分支。
git checkout --track origin/serverfix
或者git checkout -b sf origin/serverfix
完成上述命令以后,你的本地sf就会从origin/server上获取数据。
拉取
git fetch
命令会拉取本地没有的远程最新更改数据,但它只会从服务器上拉取数据,然后让你自己进行合并。
git pull
命令在大多数情况下基本等同于执行git fetch
之后紧跟着执行了git merge
命令。
一般来说,显示地直接使用fetch和merge命令比使用git pull要更好,因为git pull的机制常常使人迷惑。
删除远程服务器上的master分支:
git push origin --delete serverfix
上述操作只是删除了远程服务器上的分支指针,Git会保留数据一段时间知道下一次触发垃圾回收。
Reference
Source Control Workflow
[^2 ]: Repo 命令参考资料 ↩︎