作用:命令将存储库克隆到新目录中。
$ git clone <版本库的网址>
该命令会在本地主机生成一个目录,与远程主机的版本库同名。如果要指定不同的目录名,可以将目录名作为git clone命令的第二个参数。
$ git clone <版本库的网址> <本地目录名>
将存储库克隆到新创建的目录中,为克隆的存储库中的每个分支创建远程跟踪分支(使用git branch -r
可见),并从克隆检出的存储库作为当前活动分支的初始分支。
git clone
支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等,下面是一些例子。
http[s]://example.com/path/to/repo.git
$ git clone http://git.oschina.net/yiibai/sample.git
$ git clone ssh://example.com/path/to/repo.git
$ git clone git://example.com/path/to/repo.git
$ git clone /opt/git/project.git
$ git clone file:///opt/git/project.git
$ git clone ftp[s]://example.com/path/to/repo.git
$ git clone rsync://example.com/path/to/repo.git
-v, --verbose be more verbose
-q, --quiet be more quiet
--progress force progress reporting
-n, --no-checkout don't create a checkout
--bare create a bare repository
--mirror create a mirror repository (implies bare)
-l, --local to clone from a local repository
--no-hardlinks don't use local hardlinks, always copy
-s, --shared setup as shared repository
--recurse-submodules[=]
initialize submodules in the clone
-j, --jobs number of submodules cloned in parallel
--template
directory from which templates will be used
--reference reference repository
--reference-if-able
reference repository
--dissociate use --reference only while cloning
-o, --origin use instead of 'origin' to track upstream
-b, --branch
checkout instead of the remote's HEAD
-u, --upload-pack
path to git-upload-pack on the remote
--depth create a shallow clone of that depth
--shallow-since
$ git clone https://github.com/YangJiawei/YJWTest.git
作用:命令用于从另一个存储库下载对象和引用
git fetch [<options>] [<repository> [<refspec>…]]
git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…]
git fetch --all [<options>]
将远程存储库中的更改合并到当前分支中。在默认模式下,git pull
是git fetch
后跟git merge FETCH_HEAD
的缩写。更准确地说,git pull
使用给定的参数运行git fetch
,并调用git merge
将检索到的分支头合并到当前分支中。 使用--rebase
,它运行git rebase
而不是git merge
。
要更新所有分支,命令可以简写为:
$ git fetch
上面命令将某个远程主机的更新,全部取回本地。默认情况下,git fetch取回所有分支的更新。
作用:命令用于将两个或两个以上的开发历史加入(合并)一起。
git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit]
[-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
[--[no-]allow-unrelated-histories]
[--[no-]rerere-autoupdate] [-m <msg>] [<commit>…]
git merge --abort
git merge --continue
合并分支fixes和enhancements在当前分支的顶部,使它们合并:
$ git merge fixes enhancements
合并obsolete分支到当前分支,使用ours合并策略:
$ git merge -s ours obsolete
将分支maint合并到当前分支中,但不要自动进行新的提交:
$ git merge --no-commit maint
当您想要对合并进行进一步更改时,可以使用此选项,或者想要自己编写合并提交消息。应该不要滥用这个选项来潜入到合并提交中。小修补程序,如版本名称将是可以接受的。
将分支dev合并到当前分支中,自动进行新的提交:
$ git merge dev
作用:命令将文件内容添加到索引(将修改添加到暂存区)。也就是将要提交的文件的信息添加到索引库中。
git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p]
[--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]]
[--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing]
[--chmod=(+|-)x] [--] [<pathspec>…]\
将远程存储库中的更改合并到当前分支中。在默认模式下,git pull
是git fetch
后跟git merge FETCH_HEAD
的缩写。更准确地说,git pull
使用给定的参数运行git fetch
,并调用git merge
将检索到的分支头合并到当前分支中。 使用--rebase
,它运行git rebase
而不是git merge
。
$ git add <path>
通常是通过git add 的形式把 添加到索引库中, 可以是文件也可以是目录。
$ git add .
将目录下所有文件添加到索引库。
作用:命令用于将更改记录(提交)到存储库。将索引的当前内容与描述更改的用户和日志消息一起存储在新的提交中。
git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p]
[--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]]
[--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing]
[--chmod=(+|-)x] [--] [<pathspec>…]\
git commit
命令将索引的当前内容与描述更改的用户和日志消息一起存储在新的提交中。在使用git commit
命令之前,通过使用git add
对索引进行添加。
$ git commit -m "备注内容"
作用:命令用于将本地分支的更新,推送到远程主机。
git push [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=<git-receive-pack>]
[--repo=<repository>] [-f | --force] [-d | --delete] [--prune] [-v | --verbose]
[-u | --set-upstream] [--push-option=<string>]
[--[no-]signed|--sign=(true|false|if-asked)]
[--force-with-lease[=<refname>[:<expect>]]]
[--no-verify] [<repository> [<refspec>…]]
使用本地引用更新远程引用,同时发送完成给定引用所需的对象。可以在每次推入存储库时,通过在那里设置挂钩触发一些事件。
$ git push origin master
上面命令表示,将本地的master分支推送到origin主机的master分支。如果master不存在,则会被新建。
$ git push origin
上面命令表示,将当前分支推送到origin主机的对应分支。如果当前分支只有一个追踪分支,那么主机名都可以省略。
$ git push
重置git的认证设置
git config --system --unset credential.helper
//github或者gitlab创建空项目,然后克隆到本地
$ git clone https://github.com/YangJiawei/YJWTest.git
//进入YJWTest目录
cd YJWTest
//创建README.md文件
touch README.md
//将README.md添加到暂存区
git add README.md
//添加描述""并提交到存储库
git commit -m "add README"
//推送到远端github或gitlab上
git push -u origin master //或者直接git push
git log
命令显示从最近到最远的提交日志。如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数:
在 Git中,用HEAD
表示当前版本,也就是最新的提交commit id
,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
现在我们要把当前版本回退到上一个版本,就可以使用git reset命令:
//撤销所有更改到最近的一次commit
$ git reset --hard HEAD
//撤销到上一次的commit提交
$ git reset --hard HEAD^
//撤销到commit id为c62aa8b566cf5db3e7007fb6cffaaf421b5a5d60 的commit提交
$ git reset --hard c62aa8b566cf5db3e7007fb6cffaaf421b5a5d60 //回退到指定的版本号,版本号查看用$ git log
$ git rm --cached <added_file_to_undo>
$ git ls-remote
某些场合,一个git项目需要能同时使用两个甚至多个远程仓库,比如国内+国外、测试环境+生产环境,等等。在项目的根目录查看git配置文件,一般来说是这样的:
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
hideDotFiles = dotGitOnly
[remote "origin"]
url = https://github.com/YangJiawei/YJWTest.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
可见,我们常用的git remote add origin https://github.com/YangJiawei/YJWTest.git 中,origin只是个名字。
添加一个远程仓库,修改config文件,加入另一个远程仓库,并为其命名,比如称为yjw:
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
hideDotFiles = dotGitOnly
[remote "origin"]
url = https://github.com/YangJiawei/YJWTest.git
fetch = +refs/heads/*:refs/remotes/origin/*
[remote "yjw"]
url = https://gitee.com/yjw1230/YJWTest.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
remote = yjw
merge = refs/heads/master
使用以下命令,可以分别从两个远程仓库pull:
$ git pull origin master // 或者直接git pull
$ git pull yjwmaster
使用以下命令,可以分别push到两个远程仓库:
$ git push origin master // 或者直接git push
$ git push yjw master
在当前commit ID
版本打标签
$ git tag -a v1.2 -m 'my version 1.2'
后期追加标签到ID 9fceb02
上。
$ git tag -a v1.1 c7ed41 -m 'my version 1.1'
推送标签
$ git push origin v1.2
删除远程tag:
$ git tag -d tag_name
$ git push origin :refs/tags/tag_name
删除远程分支:
$ git push origin :branch_name
打开Git Bash。
创建存储库的裸克隆。
$ git clone --bare https://github.com/exampleuser/old-repository.git
$ cd old-repository.git $ git push --mirror https://github.com/exampleuser/new-repository.git
$ cd .. $ rm -rf old-repository.git
要创建的目录结构
YjwDemo
| -- CSharp_Js_Interactive (项目)
| -- CMD_Demo (项目)
| -- README.md (文件)
$ git clone https://gitee.com/yjw1230/YjwDemo.git
$ cd YjwDemo
$ touch README.md
$ git add README.md
$ git commit -m "first commit"
$ git push
//git submodule add
$ git submodule add https://gitee.com/yjw1230/CSharp_Js_Interactive.git CSharp_Js_Interactive
$ git status
$ git add .
$ git commit -m "添加CSharp_Js_Interactive子项目"
$ git push
.gitmodules
文件内容为:[submodule "CSharp_Js_Interactive"]
path = CSharp_Js_Interactive
url = https://gitee.com/yjw1230/CSharp_Js_Interactive.git
[submodule "CMD_Demo"]
path = CMD_Demo
url = https://gitee.com/yjw1230/CMD_Demo.git
$ git clone https://gitee.com/yjw1230/YjwDemo.git
$ cd CMD_Demo
$ git submodule init
$ git submodule update
子项目的更新时,进入子项目git pull
提交.
完成退到主目录,git status
可以查看改变,正常提交即可。
注意: git命令列表及其描述已从官方git手册页中删除。主要命令
git-add (将文件内容添加到索引中。)
git-am (从邮箱中应用一系列补丁。)
git-archive (从命名树创建文件存档。)
git-bisect (通过二进制搜索查找引入错误的更改。)
git-branch (列出,创建或删除分支。)
git-bundle (通过归档移动对象和引用。)
git-checkout (签出一个分支或工作树的路径。)
git-cherry-pick (应用某些现有提交引入的更改。)
git-citool (git-commit的图形替代。)
git-clean (从工作树中删除未跟踪的文件。)
git-clone (将存储库克隆到新目录中。)
git-commit (记录对存储库的更改。)
git-describe (显示可从提交中访问的最新标记。)
git-diff (显示提交,提交和工作树之间的更改等)
git-fetch (从另一个存储库下载对象和引用。)
git-format-patch (准备电子邮件提交补丁。)
git-gc (清理不必要的文件并优化本地存储库。)
git-grep (打印与模式匹配的行。)
git-gui (Git的便携式图形界面。)
git-init (创建一个空的git存储库或重新初始化现有存储库。)
git-log (显示提交日志。)
git-merge (将两个或多个开发历史记录连接在一起。)
git-mv (移动或重命名文件,目录或符号链接。)
git-notes (添加或检查对象注释。)
git-pull (从另一个存储库或本地分支获取并合并。)
git-push (更新远程引用以及相关对象。)
git-rebase (转发端口本地提交到更新的上游头。)
git-reset (将当前HEAD重置为指定状态。)
git-revert (还原一些现有的提交。)
git-rm (从工作树和索引中删除文件。)
git-shortlog (汇总git log输出。)
git-show (显示各种类型的对象。)
git-stash (将脏的工作目录中的更改存储起来。)
git-status (显示工作树状态。)
git-submodule (初始化,更新或检查子模块。)
git-tag (创建,列出,删除或验证使用GPG签名的标记对象。)
gitk (git存储库浏览器。)
辅助命令
1.Manipulators
git-config (获取并设置存储库或全局选项。)
git-fast-export (Git数据导出器。)
git-fast-import (快速Git数据导入器的后端。)
git-filter-branch (重写分支。)
git-lost-found ((已弃用)恢复丢失的refs,幸运的是还没有被修剪过。)
git-mergetool (运行合并冲突解决工具来解决合并冲突。)
git-pack-refs (用于高效存储库访问的包头和标签。)
git-prune (修剪对象数据库中所有无法访问的对象。)
git-reflog (管理reflog信息。)
git-relink (本地存储库中的硬链接公共对象。)
git-remote (管理一组跟踪的存储库。)
git-repack (在存储库中打包解压缩的对象。)
git-replace (创建,列出,删除引用来替换对象。)
git-repo-config ((不建议使用)获取并设置存储库或全局选项。)
2.Interrogators
git-annotate (使用提交信息注释文件行。)
git-blame (显示修改版本和作者最后一次修改文件的每一行。)
git-cherry (查找提交未合并到上游。)
git-count-objects (计算解压缩的对象数及其磁盘消耗量。)
git-difftool (使用常见的diff工具显示更改。)
git-fsck (验证数据库中对象的连通性和有效性。)
git-get-tar-commit-id (从使用git-archive创建的存档中提取提交ID。)
git-help (显示有关git的帮助信息。)
git-instaweb (立即在gitweb中浏览您的工作存储库。)
git-merge-tree (显示三向合并而不触及索引。)
git-rerere (重用已记录的冲突合并解决方案。)
git-rev-parse (选择和按摩参数。)
git-show-branch (显示分支及其提交。)
git-verify-tag (检查标签的GPG签名。)
git-whatchanged (显示每个提交引入差异的日志。)
与他人互动
这些命令通过电子邮件补丁与外部SCM和其他人进行交互。
git-archimport (将Arch存储库导入git。)
git-cvsexportcommit (将单个提交导出到CVS签出。)
git-cvsimport (从另一个SCM中抢救你的数据的人喜欢讨厌。)
git-cvsserver (git的CVS服务器模拟器。)
git-imap-send (从stdin发送补丁集合到IMAP文件夹。)
git-quiltimport (将一个quilt补丁集应用到当前分支上。)
git-request-pull (生成挂起更改的摘要。)
git-send-email (以电子邮件形式发送补丁集合。)
git-svn (Subversion存储库和git之间的双向操作。)
低级命令(管道)
尽管git包含自己的瓷层,但它的低级命令足以支持替代瓷器的开发。这些瓷器的开发者可能首先阅读git-update-index和git-read-tree。
这些低级命令的接口(输入,输出,选项集和语义)比Porcelain级别命令更稳定,因为这些命令主要用于脚本使用。另一方面,Porcelain命令的界面可能会发生变化,以改善最终用户体验。
以下描述将低级命令划分为操作对象(在存储库,索引和工作树中)的命令,询问和比较对象的命令,以及在存储库之间移动对象和引用的命令。
操纵命令
git-apply (将补丁应用于文件和/或索引。)
git-checkout-index (将文件从索引复制到工作树。)
git-commit-tree (创建一个新的提交对象。)
git-hash-object (计算对象ID,并可选择从文件创建blob。)
git-index-pack (现有打包存档的构建包索引文件。)
git-merge-file (运行三向文件合并。)
git-merge-index (为需要合并的文件运行合并。)
git-mktag (创建标记对象。)
git-mktree (从ls-tree格式的文本构建树对象。)
git-pack-objects (创建一个打包的对象存档。)
git-prune-packed (删除包文件中已有的额外对象。)
git-read-tree (将树信息读入索引。)
git-symbolic-ref (读取和修改符号引用。)
git-unpack-objects (从打包存档中解压缩对象。)
git-update-index (将工作树中的文件内容注册到索引。)
git-update-ref (安全地更新存储在ref中的对象名。)
git-write-tree (从当前索引创建一个树对象。)
询问命令
git-cat-file (提供存储库对象的内容或类型和大小信息。)
git-diff-files (比较工作树和索引中的文件。)
git-diff-index (比较索引和存储库之间blob的内容和模式。)
git-diff-tree (比较通过两个树对象找到的blob的内容和模式。)
git-for-each-ref (每个参考的输出信息)
git-ls-files (显示有关索引和工作树中文件的信息。)
git-ls-remote (在远程存储库中列出引用。)
git-ls-tree (列出树对象的内容。)
git-merge-base (尽可能找到合并的共同祖先。)
git-name-rev (查找给定转速的符号名称。)
git-pack-redundant (查找冗余包文件。)
git-rev-list (以反向时间顺序列出提交对象。)
git-show-index (显示打包的归档索引。)
git-show-ref (列出本地存储库中的引用。)
git-tar-tree ((不建议使用)在命名树对象中创建文件的tar存档。)
git-unpack-file (创建一个带有blob内容的临时文件。)
git-var (显示一个git逻辑变量。)
git-verify-pack (验证打包的git存档文件。)
通常,询问命令不会触及工作树中的文件。
同步存储库
git-daemon (一个非常简单的git存储库服务器。)
git-fetch-pack (从另一个存储库接收丢失的对象。)
git-http-backend (Git over HTTP的服务器端实现。)
git-send-pack (通过git协议将对象推送到另一个存储库。)
git-update-server-info (更新辅助信息文件以帮助哑服务器。)
以下是上面使用的帮助程序命令; 最终用户通常不直接使用它们。
git-http-fetch (通过HTTP从远程git存储库下载。)
git-http-push (通过HTTP / DAV将对象推送到另一个存储库。)
git-parse-remote (帮助解析远程存储库访问参数的例程。)
git-receive-pack (接收被推入存储库的内容。)
git-shell (仅限Git-SSH SSH访问的受限登录shell。)
git-upload-archive (将归档文件发送回git-archive。)
git-upload-pack (将对象打包回git-fetch-pack。)
内部帮助器命令
这些是其他命令使用的内部帮助程序命令; 最终用户通常不直接使用它们。
git-check-attr (显示gitattributes信息。)
git-check-ref-format (确保引用名称格式正确。)
git-fmt-merge-msg (生成合并提交消息。)
git-mailinfo (从单个电子邮件中提取补丁和作者身份。)
git-mailsplit (简单的UNIX mbox拆分程序。)
git-merge-one-file (与git-merge-index一起使用的标准帮助程序。)
git-patch-id (补丁的唯一ID计算。)
git-peek-remote ((不建议使用)列出远程存储库中的引用。)
git-sh-setup (常见的git shell脚本设置代码。)
git-stripspace (过滤掉空行。)
更多详细内容请参考:
https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git.html
https://git-scm.com/book/zh/v2
https://www.yiibai.com/git
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
https://stackoverflow.com/questions/25815202/git-fetch-a-single-commit