git相关总结
git基础
创建新仓库
创建新文件夹,打开,执行git init
以创建新的git仓库。检出仓库
执行如下命令以创建一个本地仓库的克隆版本:git clone /path/to/repository
如果是远端服务器上的仓库,命令是这个样子:git clone username@host:/path/to/repository
工作流
本地仓库由 git 维护的三棵“树”组成。第一个是 【工作目录】,它持有实际文件;第二个是 【暂存区(Index)】,它像个缓存区域,临时保存改动;最后是【HEAD】,它指向最后一次提交的结果。添加和提交
可以提出更改(把它们添加到暂存区),使用如下命令:1
2git add <filename>
git add . #添加文件到暂存区这是 git 基本工作流程的第一步;使用如下命令以实际提交改动,暂存区内容添加到仓库:
git commit -m "代码提交信息"
现在,所作改动已经提交到了 HEAD,但是还没到远端仓库。推送改动
改动现在已经在本地仓库的 HEAD 中了。执行如下命令以将这些改动提交到远端仓库:git push origin master
可以把 master 换成想要推送的任何分支。
如果还没有克隆现有仓库,并欲将仓库连接到某个远程服务器,可以使用如下命令添加:git remote add origin <server>
如此就能够将改动推送到所添加的服务器上去了。
【分支】 分支是用来将特性开发绝缘开来的。在创建仓库的时候,master 是“默认的”分支。在其他分支上进行开发,完成后再将它们合并到主分支上。
创建一个叫做“feature_x”的分支,并切换过去:git checkout -b feature_x
切换回主分支:git checkout master
再把新建的分支删掉:git branch -d feature_x
除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的:git push origin <branch>
更新与合并
要更新你的本地仓库至最新改动,执行:git pull
以在工作目录中 获取(fetch) 并 合并(merge) 远端的改动。 要合并其他分支到你的当前分支(例如 master),执行:git merge <branch>
在这两种情况下,git 都会尝试去自动合并改动。但可能并非每次都成功,并可能出现冲突(conflicts)。 这时候就需要修改这些文件来手动合并这些冲突(conflicts)。改完之后,需要执行如下命令以将它们标记为合并成功:git add <filename>
在合并改动之前,可以使用如下命令预览差异:git diff <source_branch> <target_branch>
标签
为软件发布创建标签是推荐的。这个概念早已存在,在 SVN 中也有。你可以执行如下命令创建一个叫做 1.0.0 的标签:git tag 1.0.0 1b2e1d63ff
1b2e1d63ff 是你想要标记的提交 ID 的前 10 位字符。可以使用下列命令获取提交 ID:git log
也可以使用少一点的提交 ID 前几位,只要它的指向具有唯一性。log
如果想了解本地仓库的历史记录,最简单的命令就是使用:git log
可以添加一些参数来修改他的输出,从而得到想要的结果。 只看某一个人的提交记录:git log --author=bob
一个压缩后的每一条提交记录只占一行的输出:git log --pretty=oneline
或者想通过 ASCII 艺术的树形结构来展示所有的分支, 每个分支都标示了他的名字和标签:git log --graph --oneline --decorate --all
看看哪些文件改变了:git log --name-status
这些只是可以使用的参数中很小的一部分。更多的信息,参考:git log --help
替换本地改动 假如你操作失误(当然,这最好永远不要发生),你可以使用如下命令替换掉本地改动:git checkout -- <filename>
此命令会使用 HEAD 中的最新内容替换掉工作目录中的文件。已添加到暂存区的改动以及新文件都不会受到影响。
假如想丢弃在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将本地主分支指向它:1
2git fetch origin
git reset --hard origin/master实用小贴士 内建的图形化 git:
gitk
彩色的 git 输出:
git config color.ui true
显示历史记录时,每个提交的信息只显示一行:git config format.pretty oneline
交互式添加文件到暂存区:git add -i
展示暂存区和最近版本的不同
输出工作区和暂存区的 different (不同)。git diff
git保存当前状态
untracked文件:新建的文件git stash -u
git展示所有stashes
git stash list
回到某个stash的状态
git stash apply <stash@{n}>
回到最后一个stash的状态,并删除这个stash
git stash pop
同步远程仓库的代码,并且覆盖本地的改变
慎用,会把本地commit提交的没有推送到远程的代码会覆盖掉1
git fetch origin && git reset --hard origin/master && git clean -f -d
删除已经合并到 master 的分支
删除已经合并到 master 的分支1
git branch --merged master | grep -v '^\*\| master' | xargs -n 1 git branch -d
查看标签
git tag
展示当前分支的最近的 tag
git describe --tags --abbrev=0
丢弃本地所有的修改,回到远程仓库的状态
1
git fetch origin && git reset --hard origin/master && git clean -f -d
展示本地分支关联远程仓库的情况 && 关联远程分支
展示本地分支关联远程仓库的情况git branch -vv
关联远程分支
关联之后,git branch -vv 就可以展示关联的远程分支名了,同时推送到远程仓库直接:git push,不需要指定远程仓库了。git branch -u origin/mybranch
或者在 push 时加上 -u 参数git push origin/mybranch -u
Git Checkout 远程分支
当你在本地创建一个分支时,它只存在于本地,直到它被推送到 GitHub 并成为远程分支,如下所示:1
2
3
4
5
6
7
8
9
10
11# 创建一个新的分支
git branch new-branch
# 切换到新的分支
git checkout new-branch
# 创建一个更新
touch new-file.js
# 提交更新
git add .
git commit -m "add new file"
# 推送到新的分支
git push --set-upstream origin new-branch如何 Git Checkout 远程分支
假设另一个开发人员创建了一个远程分支,而你想要拉取该分支,可按照以下步骤:- 获取所有远程分支
git fetch origin
这将从仓库中获取所有远程分支。origin 是要定位的远程名称。所以如果你有一个上游远程名称 upstream,可以调用 git fetch upstream。 - 列出所有可以 checkout 的分支
运行以下命令列出所有可以 checkout 的分支:git branch -a
这条命令的输出是所有可以 checkout 的分支。远程分支的前缀是 remotes/origin。 - 从远程分支拉取更改
请注意,你不能直接在远程分支上进行更改。因此,你需要该分支的副本。假设你想复制远程分支 fix-failing-tests,运行以下命令:git checkout -b fix-failing-tests origin/fix-failing-tests
将执行:
创建了一个名为 fix-failing-tests 的新分支
checkout 那个分支
将更改从 origin/fix-failing-tests 拉到该分支
现在你有了那个远程分支的副本。此外,可以将提交推送到该远程分支。
例如,像这样推送一个新的提交:这会将已提交的更改推送到 origin/fix-failing-tests。1
2
3
4touch new-file.js
git add .
git commit -m "add new file"
git push
例如git push origin fix-failing-tests
不必指定我们将更改推送到何处),那是因为 git 会自动设置本地分支来跟踪远程分支。
删除分支git branch -d (branchname)
合并分支git merge branchname
- 获取所有远程分支
pycharm Git版本回退 自由切换
一定需要注意的是,在切换代码版本前,一定要将当前的状态commit下来,然后再进行下面的切换操作。否则,当前修改的代码就有可能丢失了。
show git log 查看commit版本 版本11:40->版本10:33
选中版本10:33 Reset Cuurent Branch to Here 选择Hard模式即可回退 若又想回退版本11:40 要先从log记录找到版本对应commit ID,选择Reset Head 任选Hard模式就又回到代码版本了。