目录
git clone
git config
git remote
git status
git add
git rm
git mv
git commit
git branch
切换分支工作
git push
git pull
撤销git reset
下载一个项目和它的整个代码历史:git clone [url]
查看远程仓库信息:git remote -v
1、http/https方式:需要手动输入用户名和密码
2、ssh方式:本地需要生成ssh key私钥和公钥,并在github账号上添加公钥
(1) 查看是否存在ssh key,若~/.ssh存在id_rsa和id_rsa.pub则存在
cd ~/.ssh
ls
(2) 若不存在则需要生成,生成ssh key私钥和公钥方法:
ssh-keyen -t rsa -C "[email protected]"
(3) 然后把公钥id_rsa.pub内容复制到github/settings/ssh and gpg keys里面,再验证是否设置成功:
ssh -T [email protected]
Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)
config 配置有system级别、global(用户级别)和local(当前仓库)三个,设置先从system->global->local ,底层配置会覆盖顶层配置
1.查看系统config:git config --system --list
2.查看当前用户(global)配置:git config --global --list
3.查看当前仓库配置信息:git config --local --list
4.查看当前配置信息:git config --list
5.编辑Git配置文件,将打开编辑器:git config -e [--global]
6.设置提交代码时的用户信息:
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"
查看远程仓库:git remote -v
添加远程仓库:git remote add
重命名远程仓库:git remote rename
移除远程仓库:git remote remove
修改远程仓库url:git remote set-url
当执行 git status 的时候,返回结果大致可分为3个部分:
1、拟提交的变更:这是已经放入暂存区,准备使用 git commit 命令提交的变更,最后git push的内容将以这个拟提交的变更为主(包括modified, new file, deleted等)
2、未暂存的变更:这是工作目录和暂存区快照之间存在差异的文件列表
3、未跟踪的文件:这类文件对于 Git 系统来说是未知的,也是可以被忽略的
# 添加指定文件到暂存区
$ git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
$ git add [dir]
# 添加当前目录的所有文件到暂存区
$ git add .
# 添加每个变化前,都会要求确认,对于同一个文件的多处变化,可以实现分次提交
$ git add -p
将文件从工作区和暂存区中删除:git rm
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f
停止追踪指定文件,但该文件会保留在工作区:git rm --cached [file]
若此时git push到远程仓库了,会deleted tmp3.txt
若文件已经提交到暂存区了,想改文件名称,可通过git mv来同步更改工作区文件名称和暂存区文件名称
$ git mv [file-original] [file-renamed]
git commit 命令主要是将暂存区里的改动提交到本地的版本库。
每次使用 git commit 命令我们都会在本地版本库生成一个 40 位的哈希值,这个哈希值也叫 commit-id,通过git log可查看所有commit-id
commit-id 在版本回退的时候是非常有用的,它相当于一个快照,可以在未来的任何时候通过与git reset 的组合命令回到这里
git commit -m “message” :提交到版本库,并指定提交信息。
git commit -a -m “message”:-a 参数表示,可以将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过 git add 添加到暂存区。
git commit --amend :追加提交,它可以在不增加一个新的 commit-id 的情况下将新修改的代码追加到前一次的 commit-id 中。
查看分支
列出所有本地分支:git branch
列出所有远程分支:git branch -r
列出所有本地分支和远程分支:git branch -a
查看本地分支对应的上游分支:git branch -vv
查看本地分支和远程分支关联情况:git branch -avv
新建分支
新建一个分支,但依然停留在当前分支:git branch [branch-name]
切换到指定分支,并更新工作区:git checkout [branch-name]
新建一个分支,并切换到该分支:git checkout -b [branch]
重命名分支:git branch -m
删除本地分支
git branch -d
git branch --delete
删除远程分支:
git push origin --delete [branch-name]
git本地分支与远程分支关联(给当前分支设置上游分支):
git branch --set-upstream-to=origin/dev(dev关联分支名称)
git branch -u /
取消上游分支:git branch --unset-upstream
场景:你正在自己的分支(branch_v1.2)上做着功能的开发,此时需要协助他人在分支branch_v1.1做修改,步骤如下
(1) 在branch_v1.2分支,保存自己的修改:
git stash -u 【包括未跟踪的文件也会被存储】
git stash --all 【ignored files也会被存储】
(2) 切换到他人分支branch_v1.1:
git checkout -b sucloud_v1.1 origin/branch_v1.1
(3) 接着就可以在branch_v1.1分支上正常修改,提交,推送更新
(4) 完成之后就可以切回到自己的分支branch_v1.2继续之前的工作
git push <远程主机名> <本地分支名>:<远程分支名>
git push <远程主机名> <本地分支名>
如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
git push <远程主机名>
如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
git push
如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push。
git push <远程主机名> :<远程分支名>
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
git pull <远程主机名> <远程分支名>:<本地分支名>
git pull = git fetch + git merge
在使用git pull拉取服务器最新版本时,如果出现error: Your local changes to the following files would be overwritten by merge: ... Please, commit your changes or stash them before you can merge.错误时,代表这代码冲突了,本地修改了代码导致无法覆盖服务器上的。
代码冲突体现在:比如我和同事本地都拉取了最新的notebook.py文件。
场景1:只有我本地修改了这个notebook.py,在去pull或push是不会冲突的;
场景2:同事在他本地修改了这个notebook.py文件并commit和push到远程仓库了,然后我在本地修改了这个notebook.py文件,想push上去会push不上去,需要先pull下来,但pull下来时也会有冲突。
此时需要可以参考下面方法。
(1) 如果希望保留生产服务器上所做的改动,仅仅并入新配置项, 处理方法如下:
git stash -u
git pull
git stash pop
注意其中git stash带的参数含义:
If the --include-untracked (-u) option is used, all untracked files are also stashed and then cleaned up with git clean, leaving the working directory in a very clean state.
If the --all option is used instead then the ignored files are stashed and cleaned in addition to the untracked files.
(2) 如果要直接使用服务器上最新版本,那么可以选择直接覆盖
git reset --hard
git pull
注意:git stash操作默认不会存储未跟踪的文件!!!
我出错过一次导致我的新增文件都丢失了,后面通过下面方法找回来了
$ git fsck --lost-found
$ git show 126f92e2ee734c6306a224dbafc774146530b70f
$ git merge 126f92e2ee734c6306a224dbafc774146530b70f
git reset默认为:git reset --mixed
撤销 git add
撤销所有的已经 add 的文件:git reset HEAD .
撤销某个文件或文件夹:git reset HEAD
撤销 git commit
git reset --soft HEAD^
HEAD^的意思是上一个版本,也可以写成HEAD~1