Git服务器:
Github(代码托管平台)
代码托管:Github,Gitee,CODING
git的下载和安装:
https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git
下载:
https://git-scm.com/download/win
windows安装:
https://www.cnblogs.com/wj-1314/p/7993819.html
linux安装
如果要在 Linux 上安装预编译好的 Git 二进制安装包,可以直接用系统提供的包管理工具。在 Fedora 上用 yum 安装: $ yum install git-core 在 Ubuntu 这类 Debian 体系的系统上,可以用 apt-get 安装: $ apt-get install git
git(https://git-scm.com/)是一个版本控制工具
github是一个用git做版本控制的项目托管平台。
查看用户名和邮箱地址:
git config user.name
git config user.email
添加用户名及邮箱:
git config --global user.name "用户名"
git config --global user.email "邮箱"
克隆项目:
git clone
git clone https://gitee.com/jackfrued/SZ1804
用命令将本地项目上传到git
1、(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库
git init
2、把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点“.”,意为添加文件夹下的所有文件
git add .
3、用命令 git commit告诉Git,把文件提交到仓库。引号内为提交说明
git commit -m 'first commit'
4、关联到远程库
git remote add origin 你的远程库地址
如:
git remote add origin https://github.com/cade8800/ionic-demo.git
5、获取远程库与本地同步合并(如果远程库不为空必须做这一步,否则后面的提交会失败)
git pull --rebase origin master
6、把本地库的内容推送到远程,使用 git push命令,实际上是把当前分支master推送到远程。执行此命令后会要求输入用户名、密码,验证通过后即开始上传。
git push -u origin master
*、状态查询命令
git status
版本控制:
git add .
将更改纳入暂存区
git add 已经更改的文件名
更新某个文件
git status
查看暂存区状态
git commit -m '提交的原因'
提交代码(在本地实施版本控制)
版本回退:
查日志:
git log
Administrator@ZJ-201801241106 MINGW64 ~/SZ1804 (master) $ git log commit f7604748c6409e0d06470297ce9c7f46667b7489 (HEAD -> master, origin/master, origin/HEAD) Author: jackfruedDate: Mon Aug 27 14:39:03 2018 +0800 修改了冒泡排序函数的代码 commit 82b71f881253386acf6fb265cc7171af4ae10db3 Author: jackfrued Date: Mon Aug 27 11:56:42 2018 +0800 添加了第1天上午的代码 commit 6fd911f093c7bc63230f821ae5060704fe15f6a3 Author: jackfured Date: Mon Aug 27 11:55:34 2018 +0800 Initial commit
git reset --hard HEAD^
代码和工作区都回到上一个版本
git reset --hard 版本哈希码
代码和工作区都回到该指定版本
Administrator@ZJ-201801241106 MINGW64 ~/SZ1804 (master) $ git reset --hard f76047 HEAD is now at f760474 修改了冒泡排序函数的代码
git reflog
查看日志(包含未来版本)
git push
推到服务器(上传修改)
git pull
从服务器拉取(下载更新)
删除:
1).在本地项目里,cd到本项目根路径下;
2).执行添加: git rm -r --cached '文件夹名'
3).提交注释:git commit -m '删除xxx'
4).最后:git push
创建切换分支
创建: git branch 分支名
切换到分支: git checkout 目标分支名
git checkout -b 分支名
回到主分支:git checkout master
删除分支:git branch -d 要删除的分支名
分支提交工作:
先将分支push上去:git push origin 分支名
github-flow
PR分支管理策略 - Pull Request
上传代码到Git上面,有时候会遇到各种情况,有些时候是因为合并代码冲突,有些时候是因为修改了Git的登录密码需要重新认证。那么这里就来讲解错误提示fatal: Authentication failed for 'https://gitee.com/XXX/XXX.git/‘的解决方法。 在一次上传代码的时候,不知道修改Git登录密码需要重新认证这个情况,然后提交代码的时候提示了上面的那个错误,当时有点意外,毕竟第一次遇到这种问题,然后就搜教程开始解决,但是第一次尝试没有成功,后来又试了一次,解决可以正常上传提交代码了,步骤其实很简单,具体如下所示: 方法一: git config --global user.name "xxx" git config --global user.email "xxx" 方法二: git remote -v git remote remove origin git remote add origin xxx 上面的这两个方法如果解决不了问题,再尝试一下下面这个方法,一般情况下下面这个方法可以解决这类问题,具体如下所示: git config --system --unset credential.helper 执行这个命令之后,你可以重新写入账号密码,这样就可以重新提交代码了。
git 分支管理
https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%AE%A1%E7%90%86
现在已经创建、合并、删除了一些分支,让我们看看一些常用的分支管理工具。 git branch 命令不只是可以创建与删除分支。 如果不加任何参数运行它,会得到当前所有分支的一个列表: $ git branch iss53 * master testing 注意 master 分支前的 * 字符:它代表现在检出的那一个分支(也就是说,当前 HEAD 指针所指向的分支)。 这意味着如果在这时候提交,master 分支将会随着新的工作向前移动。 如果需要查看每一个分支的最后一次提交,可以运行 git branch -v 命令: $ git branch -v iss53 93b412c fix javascript issue * master 7a98805 Merge branch 'iss53' testing 782fd34 add scott to the author list in the readmes --merged 与 --no-merged 这两个有用的选项可以过滤这个列表中已经合并或尚未合并到当前分支的分支。 如果要查看哪些分支已经合并到当前分支,可以运行 git branch --merged: $ git branch --merged iss53 * master 因为之前已经合并了 iss53 分支,所以现在看到它在列表中。 在这个列表中分支名字前没有 * 号的分支通常可以使用 git branch -d 删除掉;你已经将它们的工作整合到了另一个分支,所以并不会失去任何东西。 查看所有包含未合并工作的分支,可以运行 git branch --no-merged: $ git branch --no-merged testing 这里显示了其他分支。 因为它包含了还未合并的工作,尝试使用 git branch -d 命令删除它时会失败: $ git branch -d testing error: The branch 'testing' is not fully merged. If you are sure you want to delete it, run 'git branch -D testing'. 如果真的想要删除分支并丢掉那些工作,如同帮助信息里所指出的,可以使用 -D 选项强制删除它。
Pycharm连接Git:
VCS ---->checkout from version control ---> Git:
添加要clone的项目的地址,将其克隆到本地
Git忽略规则.gitignore,忽略特殊文件
首先要强调一点,这个文件的完整文件名就是".gitignore",注意最前面有个“.”。 一般来说每个Git项目中都需要一个“.gitignore”文件,这个文件的作用就是告诉Git哪些文件不需要添加到版本管理中。实际项目中,很多文件都是不需要版本管理的,比如Python的.pyc文件和一些包含密码的配置文件等等。这个文件的内容是一些规则,Git会根据这些规则来判断是否将文件添加到版本控制中。
下面我们看看常用的规则: 1)/mtk/ 过滤整个文件夹 2)*.zip 过滤所有.zip文件 3)/mtk/do.c 过滤某个具体文件
很简单吧,被过滤掉的文件就不会出现在git仓库中(gitlab或github)了,当然本地库中还有,只是push的时候不会上传。 需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中: 1)!*.zip 2)!/mtk/one.txt
唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。 为什么要有两种规则呢?想象一个场景:假如我们只需要管理/mtk/目录中的one.txt文件,这个目录中的其他文件都不需要管理,那么我们就需要使用: 1)/mtk/ 2)!/mtk/one.txt 假设我们只有过滤规则,而没有添加规则,那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来!
最后需要强调的一点是,如果你不慎在创建.gitignore文件之前就push了项目,那么即使你在.gitignore文件中写入新的过滤规则,这些规则也不会起作用,Git仍然会对所有文件进行版本管理。 简单来说,出现这种问题的原因就是Git已经开始管理这些文件了,所以你无法再通过过滤规则过滤它们。因此一定要养成在项目开始就创建.gitignore文件的习惯,否则一旦push,处理起来会非常麻烦。
.gitignore配置文件用于配置不需要加入版本管理的文件,配置好该文件可以为版本管理带来很大的便利,以下是对于配置.gitignore的一些心得记录:
1)配置语法:
以斜杠“/”开头表示目录; 以星号“*”通配多个字符; 以问号“?”通配单个字符 以方括号“[]”包含单个字符的匹配列表; 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;
此外,git 对于 .ignore 配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;
2)示例说明
a)规则:fd1/* 说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略; b)规则:/fd1/* 说明:忽略根目录下的 /fd1/ 目录的全部内容; c)规则: /* !.gitignore !/fw/bin/ !/fw/sf/ 说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;
在项目目录下创建一个.gitignore
文件,在文件中添加忽略文件内容
自动生成忽略文件的网站: www.gitignore.io 输入开发语言,操作系统及编译工具,点create Python Windows Pycharm+all
生成文件
# Created by https://www.gitignore.io/api/python,windows,pycharm+all ### PyCharm+all ### # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 # User-specific stuff .idea/**/workspace.xml .idea/**/tasks.xml .idea/**/usage.statistics.xml .idea/**/dictionaries .idea/**/shelf # Sensitive or high-churn files .idea/**/dataSources/ .idea/**/dataSources.ids .idea/**/dataSources.local.xml .idea/**/sqlDataSources.xml .idea/**/dynamic.xml .idea/**/uiDesigner.xml .idea/**/dbnavigator.xml # Gradle .idea/**/gradle.xml .idea/**/libraries # Gradle and Maven with auto-import # When using Gradle or Maven with auto-import, you should exclude module files, # since they will be recreated, and may cause churn. Uncomment if using # auto-import. # .idea/modules.xml # .idea/*.iml # .idea/modules # CMake cmake-build-*/ # Mongo Explorer plugin .idea/**/mongoSettings.xml # File-based project format *.iws # IntelliJ out/ # mpeltonen/sbt-idea plugin .idea_modules/ # JIRA plugin atlassian-ide-plugin.xml # Cursive Clojure plugin .idea/replstate.xml # Crashlytics plugin (for Android Studio and IntelliJ) com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties fabric.properties # Editor-based Rest Client .idea/httpRequests ### PyCharm+all Patch ### # Ignores the whole .idea folder and all .iml files # See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360 .idea/ # Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 *.iml modules.xml .idea/misc.xml *.ipr ### Python ### # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # pyenv .python-version # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ ### Python Patch ### .venv/ ### Python.VirtualEnv Stack ### # Virtualenv # http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ [Bb]in [Ii]nclude [Ll]ib [Ll]ib64 [Ll]ocal [Ss]cripts pyvenv.cfg pip-selfcheck.json ### Windows ### # Windows thumbnail cache files Thumbs.db ehthumbs.db ehthumbs_vista.db # Dump file *.stackdump # Folder config file [Dd]esktop.ini # Recycle Bin used on file shares $RECYCLE.BIN/ # Windows Installer files *.cab *.msi *.msix *.msm *.msp # Windows shortcuts *.lnk # End of https://www.gitignore.io/api/python,windows,pycharm+all
将其拷贝至.gitignore
中,保存即可
有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status
都会显示Untracked files ...
,有强迫症的童鞋心里肯定不爽。
好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore
文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
不需要从头写.gitignore
文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore
忽略文件的原则是:
忽略操作系统自动生成的文件,比如缩略图等;
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class
文件;
忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
举个例子:
假设你在Windows下进行Python开发,Windows会自动在有图片的目录下生成隐藏的缩略图文件,如果有自定义目录,目录下就会有Desktop.ini
文件,因此你需要忽略Windows自动生成的垃圾文件:
# Windows: Thumbs.db ehthumbs.db Desktop.ini
然后,继续忽略Python编译产生的.pyc
、.pyo
、dist
等文件或目录:
# Python: *.py[cod] *.so *.egg *.egg-info dist build
加上你自己定义的文件,最终得到一个完整的.gitignore
文件,内容如下:
# Windows: Thumbs.db ehthumbs.db Desktop.ini # Python: *.py[cod] *.so *.egg *.egg-info dist build # My configurations: db.ini deploy_key_rsa
最后一步就是把.gitignore
也提交到Git,就完成了!当然检验.gitignore
的标准是git status
命令是不是说working directory clean
。
使用Windows的童鞋注意了,如果你在资源管理器里新建一个.gitignore
文件,它会非常弱智地提示你必须输入文件名,但是在文本编辑器里“保存”或者“另存为”就可以把文件保存为.gitignore
了。
有些时候,你想添加一个文件到Git,但发现添加不了,原因是这个文件被.gitignore
忽略了:
$ git add App.class The following paths are ignored by one of your .gitignore files: App.class Use -f if you really want to add them.
如果你确实想添加该文件,可以用-f
强制添加到Git:
$ git add -f App.class
或者你发现,可能是.gitignore
写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore
命令检查:
$ git check-ignore -v App.class .gitignore:3:*.class App.class
Git会告诉我们,.gitignore
的第3行规则忽略了该文件,于是我们就可以知道应该修订哪个规则。
小结
忽略某些文件时,需要编写.gitignore
;
.gitignore
文件本身要放到版本库里,并且可以对.gitignore
做版本管理!
码云是开源中国社区2013年推出的基于 Git 的完全免费的代码托管服务,这个服务是基于 Gitlab 开源软件所开发的,我们在 Gitlab 的基础上做了大量的改进和定制开发,目前已经成为国内最大的代码托管系统,致力于为国内开发者提供优质稳定的托管服务。
码云主要功能
码云除了提供最基础的 Git 代码托管之外,还提供代码在线查看、历史版本查看、Fork、Pull Request、打包下载任意版本、Issue、Wiki 、保护分支、代码质量检测、PaaS 项目演示等方便管理、开发、协作、共享的功能。
优点:服务器在国内,在国内访问速度比github快很多,可以免费让自己的仓库他人不可见,但是否安全就不知道了。访问速度很快,支持svn,git两种方式,免费账户同样可以建立 私有项目,而 github 上要建立私有项目必须 付费。
缺点:每个仓库有1G的容量限制,把Unity工程弄上去一下就超了。
GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征。所以,这篇文章的主要目的就是通过介绍GIT能做什么、它和SVN在深层次上究竟有什么不同来帮助你认识它。
1.GIT是分布式的,SVN不是:
这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。如果你能理解这个概念,那么你就已经上手一半了。需要做一点声明,GIT并不是目前第一个或唯一的分布式版本控制系统。还有一些系统,例如Bitkeeper, Mercurial等,也是运行在分布式模式上的。但GIT在这方面做的更好,而且有更多强大的功能特征。
GIT跟SVN一样有自己的集中式版本库或服务器。但,GIT更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个自己的版本库。可以这样说,如果你被困在一个不能连接网络的地方时,就像在飞机上,地下室,电梯里等,你仍然能够提交文件,查看历史版本记录,创建项目分支,等。对一些人来说,这好像没多大用处,但当你突然遇到没有网络的环境时,这个将解决你的大麻烦。
同样,这种分布式的操作模式对于开源软件社区的开发来说也是个巨大的恩赐,你不必再像以前那样做出补丁包,通过email方式发送出去,你只需要创建一个分支,向项目团队发送一个推请求。这能让你的代码保持最新,而且不会在传输过程中丢失。GitHub.com就是一个这样的优秀案例。
有些谣言传出来说subversion将来的版本也会基于分布式模式。但至少目前还看不出来。
2.GIT把内容按元数据方式存储,而SVN是按文件:
所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。如果你把.git目录的体积大小跟.svn比较,你会发现它们差距很大。因为,.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。
3.GIT分支和SVN的分支不同:
分支在SVN中一点不特别,就是版本库中的另外的一个目录。如果你想知道是否合并了一个分支,你需要手工运行像这样的命令svn propget svn:mergeinfo,来确认代码是否被合并。感谢Ben同学指出这个特征。所以,经常会发生有些分支被遗漏的情况。
然而,处理GIT的分支却是相当的简单和有趣。你可以从同一个工作目录下快速的在几个分支间切换。你很容易发现未被合并的分支,你能简单而快捷的合并这些文件。
4.GIT没有一个全局的版本号,而SVN有:
目前为止这是跟SVN相比GIT缺少的最大的一个特征。你也知道,SVN的版本号实际是任何一个相应时间的源代码快照。我认为它是从CVS进化到SVN的最大的一个突破。因为GIT和SVN从概念上就不同,我不知道GIT里是什么特征与之对应。如果你有任何的线索,请在评论里奉献出来与大家共享。
更新:有些读者指出,我们可以使用GIT的SHA-1来唯一的标识一个代码快照。这个并不能完全的代替SVN里容易阅读的数字版本号。但,用途应该是相同的。
5.GIT的内容完整性要优于SVN:
GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。这里有一个很好的关于GIT内容完整性的讨论 –http://stackoverflow.com/questions/964331/git-file-integrity
1.创建存储库库(Repository)
存储库(repository)通常用于组织单个项目。 存储库可以包含文件夹和文件,图像,视频,电子表格和数据集 - 即项目需要的任何内容。 我们建议您包括一个README文件,或包含有关您的项目信息的文件。 GitHub使得在创建新存储库的同时添加一个README文件很容易实现。 它还提供其他常见选项,如许可证文件。 你的 hello-world
存储库 可以是一个你存储想法,资源,甚至与他人分享和讨论内容的地方。
创建新存储库(Repository)
在右上角,在您的头像或识别码旁边,单击 + 然后选择“Create new...”。
命名您的存储库名称为hello-world
。
写一个简短的描述(description)。
勾选 Initialize this repository with a README(使用README初始化此存储库。)
点击 Create repository(创建存储库)。
2.创建分支(Branch)
分支(Branching) 是同时在同一个存储库中创建不同版本的方式。 默认情况下,你的仓库有一个名称为master
的分支,它被认为是最终分支。 我们使用分支进行实验和编辑,然后将分支提交到master
。 当您在主master
分支上创建分支时,您就创建了主master
节点在该时间点的副本或快照。 如果有人在您在分支上工作时对主master
分支进行了更改,你就可以提取这些更新。 此图显示:
主分支 The master
branch
一个新的分支称之为 映像(feature
)(因为我们在这个分支上做“映像工作”)
在映像(feature
)被合并到主 master
分支上的旅程
你曾经保存过一个文件的不同版本吗? 就像是:
story.txt
story-joe-edit.txt
story-joe-edit-reviewed.txt
分支(Branch) 在GitHub存储库中实现类似的目标。 在GitHub上,我们的开发人员,作家和设计师使用分支来保持错误的修复和功能工作在独立于我们的主(产品)分支上。 当更改准备就绪时,它们将其分支合并到主master()节点上。
创建一个新的分支
进入您的新存储库hello-world
。
单击文件列表顶部叫做 branch:master 的下拉列表。
在新分支文本框中键入分支名称readme-edits。
选择蓝色的 Create branch 框或按键盘上的“Enter”。 [图片上传失败...(image-900a77-1513732778552)] 现在你有两个分支,master
和readme-edits
。 他们看起来完全一样,但不长久! 接下来,我们将把更改添加到新分支。
3.制作并提交更改
4.开启;拉去请求(Pull Request)
5.合并(merge)请求
在这最后一步,是时候把你的更改放在一起了 - 合并你的readme-edits
分支到master
分支。
单击绿色Merge pull request按钮将更改合并到master
中。 [图片上传失败...(image-fc048d-1513732778552)]
单击确认合并(Confirm merge)。
继续并删除分支,因为它的更改已被合并,删除分支(Delete branch)按钮在紫色框中。
E:\code>git status On branch master Your branch is up to date with 'origin/master'. Changes not staged for commit: (use "git add..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) (commit or discard the untracked or modified content in submodules) modified: SP/cookies_advanced/CookiesPool (modified content) modified: datasyn (untracked content) no changes added to commit (use "git add" and/or "git commit -a")
modified: 问题
可能是因为该文件夹下有.git 文件 删除之后重新 git add 该文件夹即可