一、获取与创建项目
-
创建一个git仓库,初始化项目
$ git init
-
复制一个git仓库,克隆
$ git clone [url] // [url]为你想要复制的项目链接 // 例子 $ git clone http://xxx.git
二、基本用法(对代码在缓存区的操作)
-
添加文件到缓存区
$ git add . // . 表示当前目录,路径可以修改,文件也可以添加到缓存区,例如:$ git add README // 不加参数默认为将修改操作的文件和未跟踪新添加的文件添加到git系统的暂存区,注意不包括删除,常用! $ git add -u . // -u 表示将已跟踪文件中的修改和删除的文件添加到暂存区,不包括新增加的文件,注意这些被删除的文件被加入到暂存区再被提交并推送到服务器的版本库之后这个文件就会从git系统中消失了。 $ git add -A . // -A 表示将所有的已跟踪的文件的修改与删除和新增的未跟踪的文件都添加到暂存区。
-
查看工作区代码相对于缓存区的差别
$ git status // 常用,获得详细的结果输出 $ git status -s // 获得简短的结果输出
-
将缓存区内容添加到本地仓库,提交代码
$ git commit -m '提交时交代的信息,例如:提交了什么功能'
-
撤销修改(已使用git add缓存代码,未使用git commit)
$ git restore --staged [file] // 表示从暂存区将文件的状态修改成 unstage 状态。当然,也可以不指定确切的文件 ,例如: $ git restore --staged *.java // 表示将所有暂存区的java文件恢复状态 $ git restore --staged . // 表示将当前目录所有暂存区文件恢复状态 // --staged 参数就是表示仅仅恢复暂存区的 // 表示撤销暂存区的修改,将文件状态恢复到未 git add 之前 // git restore为git2.23新语法
-
放弃本地文件修改(未使用git add缓存代码)
$ git checkout -- [filename] $ git checkout . // 放弃所有文件的修改 git checkout,此命令用于放弃掉所有未加入缓存区(没有使用git add)的修改:对文件的修改操作和对文件执行的删除操作 注:此命令不会删除新建的文件,因为新建的文件还没加入git管理系统中,没有track,所以对git来说它是未知的,只需手动删除即可
-
撤销修改提交(已经用git commit 提交了代码)
$ git reset --hard HEAD^ // 使用git reset --hard HEAD^ 来回退到上一次commit的状态 $ git reset --hard commit [id] // 或者回退到任意版本,使用git log命令查看git提交历史和commit id
三、分支与合并
-
列出分支
$ git branch // 没有参数时,git branch 会列出你在本地的分支。你所在的分支的行首会有个星号作标记。 如果你开启了彩色模式,当前分支会用绿色显示。
-
创建新分支
$ git branch [newbranchname] // 本地创建一个新分支 $ git push origin [newbranchname]:[newbranchname] // 把新建的本地分支push到远程服务器,远程分支与本地分支同名(当然可以随意起名)
-
切换分支
切换分支前,如果当前分支有代码修改,需要把当前分支的代码先提交,再切换到别的分支 $ git checkout [branchname] // 切换分支 $ git switch [branchname] // 切换分支,git2.23新语法 $ git switch - // 切换到上一个切换的分支
-
创建新分支,并立即切换到它
$ git checkout -b [newbranchname] $ git switch -c [newbranchname]
-
删除分支
$ git branch -d [branchname] // 删除本地分支 $ git push origin --delete [branchname] // 删除远程分支
-
将分支合并到当前分支
例子:要把test的代码合并到master上去 第一步:切换到要被合并的分支 $ git checkout master 第二步:分支合并 $ git merge test
-
合并冲突
一般出现冲突时会告知你合并失败的,并告知你冲突出现在哪个文件,然后手动解决冲突,处理完冲突之后,再来一遍提交代码的操作 $ git mergetool // 该命令会为你启动一个合适的可视化合并工具,并带领你一步一步解决这些冲突
-
显示一个分支中提交的更改记录
$ git log // 查看更改日志 $ git log --oneline // --oneline 查看历史记录的紧凑简洁的版本 $ git log --oneline --graph // --graph 查看历史中什么时候出现了分支、合并
-
给历史记录中的某个重要的一点打上标签
$ git tag -a v1.0.0 // 如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。 该 tag 命令基本上会给该特殊提交打上永久的书签,从而使你在将来能够用它与其他提交比较。 通常,你会在切取一个发布版本或者交付一些东西的时候打个标签。如上例:发布了一个v1.0.0的版本,打个标签,记录这个版本
-
存储,临时保存修改
注:在未add之前才能执行stash,不想提交代码却要切换分支,把修改记录存储起来,暂存区的文件为空 $ git stash [save message] // 保存,save为可选项,message为本次保存的注释 // 例子: git stash save '存储记录标识' $ git stash list // 查看所有保存的记录列表 $ git stash apply stash@{num} // 应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1} $ git stash pop stash@{num} // 应用某个存储,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下 $ git stash drop stash@{num} // 删除某个保存,从列表中删除这个存储 $ git stash clear // 删除所有缓存的stash
-
指定的提交(commit)应用于其他分支
$ git cherry-pick [commitHash] 举例说明:代码仓库有master和dev两个分支,把dev的一个提交应用到master 1.找到dev这个提交的哈希值(commitHash)并复制 2.切换到master分支:$ git checkout master 3.Cherry pick 操作:$ git cherry-pick [commitHash] // 注:Cherry pick 支持一次转移多个提交: $ git cherry-pick <HashA> <HashB>
四、分享和更新项目
-
从远端仓库提取数据并尝试合并到当前分支
$ git pull
-
推送你的新分支与数据到某个远端仓库
$ git push [远程主机名] [本地分支名]:[远程分支名] $ git push origin master:master // 如果本地分支名与远程分支名相同,则可以省略冒号,如下: $ git push origin master // 如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建 $ git push origin:refs/for/master // 如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin –delete master $ git push origin // 如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支 $ git push // 如果当前分支只有一个远程分支,那么主机名都可以省略