Git е система за контрол на версиите (VCS), която улеснява проследяването на промените във файловете. Например, когато редактирате текстов файл, git може да ви помогне да определите какво точно се е променило, кой го е променил и защо. Основно е полезен при координиране с множество програмисти, работещи по едни и същи проекти едновременно. Git предоставя гъвкавост на програмиста да работи по проект независимо, без да засяга работата на другите. Ето един сценарий, Екип от 50 разработчици, работещи по проект едновременно и непрекъснато обновяващи кода. По същото време друг разработчик актуализира същия код със своите промени, което причинява конфликта. Как може да се избегне този конфликт.

Разработчикът може да изреже отделен локален клон и да започне да прави своите промени. След като промените са направени, разработчикът трябва да вземе изтеглянето от клона master, да разреши конфликтите, ако има такива, и да изпрати промените в главния клон на хранилището. След като промените бъдат обединени с основния главен клон, тогава той ще бъде видим и за други разработчици. По-долу са сериите от често използвани команди.

  • Създайте празно git хранилище или повторно инициализиране, ако вече съществува.. Това ще създаде .gitдиректория в текущата ви директория, която ще има няколко важни директории и файлове.
ansible[@[:~/ansible$ git init
ansible[@[:~/ansible$ cd .git
ansible[@[:~/ansible$ ls -lart
drwxr-xr-x+ objects
drwxr-xr-x+ info
drwxr-xr-x+ hooks
-rw-r — r — + description
-rw-r — r — + config
-rw-r — r — + HEAD
HEAD: Content of HEAD file refers to different file ref: refs/heads/master . The file contains the hash of the most recent commit on the master branch
  • Клониране на хранилище
ansible[@[:~/ansible$ git clone https://github.com/ansible/ansible.git
Cloning into ‘ansible’…
remote: Counting objects: 306502, done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 306502 (delta 10), reused 0 (delta 0), pack-reused 306486
Receiving objects: 100% (306502/306502), 109.82 MiB | 2.55 MiB/s, done.
Resolving deltas: 100% (194314/194314), done.
Checking connectivity… done.
ansible[@[:~/ansible$
  • Избройте текущия клон
ansible[@[:~/ansible/ansible$ git branch
* devel
ansible[@[:~/ansible/ansible$
  • Избройте всички клонове
ansible[@[:~/ansible/ansible$ git branch -a
* devel
remotes/origin/HEAD -> origin/devel
remotes/origin/devel
remotes/origin/release1.5.0
remotes/origin/release1.5.1
remotes/origin/release1.5.2
remotes/origin/release1.5.3
remotes/origin/release1.5.4
remotes/origin/release1.5.5
remotes/origin/release1.6.0
remotes/origin/stable-1.9
remotes/origin/stable-2.0
remotes/origin/stable-2.0-network
remotes/origin/stable-2.0.0.1
remotes/origin/stable-2.1
remotes/origin/stable-2.2
remotes/origin/stable-2.3
remotes/origin/temp-staging-post-2.4.4
remotes/origin/threading_instead_of_forking
remotes/origin/threading_plus_forking
ansible[@[:~/ansible/ansible$
ansible[@[:~/ansible/ansible$ git checkout release1.5.0
Branch release1.5.0 set up to track remote branch release1.5.0 from origin.
Switched to a new branch 'release1.5.0'
ansible[@[:~/ansible/ansible$ git branch
  devel
* release1.5.0
ansible[@[:~/ansible/ansible$
  • Изтеглете най-новите промени (ако има промени в локалното копие, първо разрешете конфликта). За да разрешите конфликтите Вижте: Как да разрешите конфликти в git
ansible[@[:~/ansible/ansible$ git pull
remote: Counting objects: 7, done.
remote: Total 7 (delta 4), reused 4 (delta 4), pack-reused 2
Unpacking objects: 100% (7/7), done.
From https://github.com/ansible/ansible
   0a6b951..190755f  devel      -> origin/devel
Already up-to-date.
ansible[@[:~/ansible/ansible$
  • Създайте клон local_changes, за да започнете вашите промени.

Създадохме локален клон с име local_changes, но указателят все още препраща към release1.5.0. Трябва да проверим клона, преди да започнем работа.

ansible[@[:~/ansible/ansible$ git branch
  devel
  local_changes
* release1.5.0
ansible[@[:~/ansible/ansible$
  • Изтрийте локален клон local_changes(използвайки -d флаг).
ansible[@[:~/ansible/ansible$ git branch -d local_changes
Deleted branch local_changes (was 6221a27).
ansible[@[:~/ansible/ansible$ git branch
  devel
* release1.5.0
ansible[@[:~/ansible/ansible$
  • Създайте и прегледайте клон local_changesдиректно.
ansible[@[:~/ansible/ansible$ git checkout -b local_changes
Switched to a new branch 'local_changes'
ansible[@[:~/ansible/ansible$ git branch
  devel
* local_changes
  release1.5.0
ansible[@[:~/ansible/ansible$
  • Направете промените в кода и проверете състоянието. Ще ви даде списък с добавени/изтрити/актуализирани файлове.

Създадохме нов файл с име ansible.yml и актуализирахме файла setup.py. В момента и двата файла са непроследени.

ansible[@[:~/ansible/ansible$ git status
On branch local_changes
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
modified:   setup.py
Untracked files:
  (use "git add <file>..." to include in what will be committed)
ansible.yml
no changes added to commit (use "git add" and/or "git commit -a")
ansible[@[:~/ansible/ansible$
  • Вземете разликата и проверете промените с главния клон. Знакът плюс + показва новодобавените редове във файла setup.py.
ansible[@[:~/ansible/ansible$ git diff setup.py 
diff --git a/setup.py b/setup.py
index c537ee9..bfb0462 100644
--- a/setup.py
+++ b/setup.py
@@ -22,6 +22,24 @@ data_files = []
 for i in dirs:
     data_files.append((os.path.join(install_path, i), glob('./library/' + i + '/*')))
 
+
+print "Adding a test statement"
  • Преместете променените файлове в етапа.

Новият файл ansible.ymlе преместен в етапната област и е готов за ангажиране сега.

ansible[@[:~/ansible/ansible$ git add ansible.yml
ansible[@[:~/ansible/ansible$ git status
On branch local_changes
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
new file:   ansible.yml
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
modified:   setup.py
ansible[@[:~/ansible/ansible$
  • Ако искате да преместите промените обратно към премахване на етапа. Използвайки командата по-долу, ние сме на същото място, където бяхме преди git add.
ansible[@[:~/ansible/ansible$ git reset HEAD ansible.yml 
Unstaged changes after reset:
M setup.py
ansible[@[:~/ansible/ansible$ git status
On branch local_changes
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
modified:   setup.py
Untracked files:
  (use "git add <file>..." to include in what will be committed)
ansible.yml
no changes added to commit (use "git add" and/or "git commit -a")
ansible[@[:~/ansible/ansible$
  • Ако искате да работите върху друг клон и да го ангажирате в master поради някакъв непосредствен проблем, тогава може да се използва git stash. Stash е много хубава функция, предоставена от git. Вижте страницата, за да разберетеgit Stash.
ansible[@[:~/ansible/ansible$ git stash
Saved working directory and index state WIP on local_changes: 6221a27 Updating files for new upstream release 1.5.0
HEAD is now at 6221a27 Updating files for new upstream release 1.5.0
ansible[@[:~/ansible/ansible$ git status
On branch local_changes
Untracked files:
  (use "git add <file>..." to include in what will be committed)
ansible.yml
nothing added to commit but untracked files present (use "git add" to track)
ansible[@[:~/ansible/ansible$ git stash list
stash@{0}: WIP on local_changes: 6221a27 Updating files for new upstream release 1.5.0
  • Извършете промените.
ansible[@[:~/ansible/ansible$ git add setup.py
ansible[@[:~/ansible/ansible$ git commit -m 'Added print statement in file setup.py'
[local_changes 74139d3] Added print statement in file setup.py
 1 file changed, 2 insertions(+)
ansible[@[:~/ansible/ansible$ git status
On branch local_changes
Untracked files:
  (use "git add <file>..." to include in what will be committed)
ansible.yml
nothing added to commit but untracked files present (use "git add" to track)
ansible[@[:~/ansible/ansible$
Note: We can see ansible.yml is still untracked as we have not added this file for commit.
 
  • До този момент промените са комитирани само в локалния клон local_changes. Промените са налични само в локалната система, което може да се провери чрез проверка на git logs.

Той ще предостави списъка с ангажименти с техния хеш, име на автор и дата

ansible[@[:~/ansible/ansible$ git log
commit 74139d323f4c9cbbd5b1f78f0e33017dcd67042f
Author: OpenInfo <[email protected]>
Date:   Sat Mar 17 17:27:26 2018 -0700
Added print statement in file setup.py
commit 6221a2740f5c3023c817d13e4a564f301ed3bc73
Author: James Cammarata <[email protected]>
Date:   Fri Feb 28 14:17:07 2014 -0600
Updating files for new upstream release 1.5.0
  • Пуснете промените в дистанционно.

Директен опит за натискане на клона на отдалечено ще се провали поради недостъпност на клона local_changes на отдалечен сайт. Така че трябва изрично да кажем информацията нагоре по веригата.

ansible[@[:~/ansible/ansible$ git push
fatal: The current branch local_changes has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin local_changes
ansible[@[:~/ansible/ansible$ git push --set-upstream origin local_changes
Username for 'https://github.com': OpenInfo
Password for 'https://[email protected]':
  • Ако сте администратор на хранилище, тогава сте готови или в противен случай отидете на потребителския интерфейс на github и създайте заявка за изтегляне и помолете администратора да се слее в главния клон.